[英]Piping echo output into xargs
我正試圖通過xargs
管道一個值列表。 這是一個簡單的例子:
echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon
我希望這會輸出以下內容:
Hello Landon
Hola Landon
Bonjour Landon
相反,該命令輸出:
Hello Hola Bonjour Landon
我錯過了什么?
在-I
, man xargs
說
不帶引號的空格不會終止輸入項; 相反,分隔符是換行符
您可以指定不同的分隔符(至少在GNU xargs中):
printf 'Hello Hola Bonjour' | xargs -d' ' -I _ echo _ Landon
更方便的是,使用\\0
作為分隔符,使用-0
來使用它:
printf '%s\0' Hello Hola Bonjour | xargs -0 -I _ echo _ Landon
需要更改分隔符,還必須指定-L選項。 因此要么通過-d更改分隔符,要么像建議的其他答案那樣更改分隔符,要么管道sed並用換行符替換空格
echo "Hello Hola Bonjour" | sed -e 's/ /\n/g' | xargs -L 1 -I _ echo _ Landon
結果是
Hello Landon
Hola Landon
Bonjour Landon
有時更改分隔符是不夠的。 xargs有時會獲取所有輸入參數並立即傳遞所有參數。 沒有分裂的論點。
例如
seq 1 7 | xargs echo
結果是
1
2
3
4
5
6
7
被傳遞給xargs,所以輸出就是
1 2 3 4 5 6 7
如果添加xargs手冊頁中顯示的-L 1
-L max-lines每個命令行最多使用max-lines nonblank輸入行。 尾隨空白導致輸入行在下一個輸入行上邏輯上繼續。 意味着-x。
seq 1 7 | xargs -L 1 echo
然后你會看到
1
2
3
4
5
6
7
您也可以手動將其轉換為for循環,這樣可以更輕松地設置多行語句。
# be absolutely sure the values the for loop iterates over is well sanitized to avoid glob expansion of the *.
for i in Hello Hola Bonjour
do
if [ "$i" = "Hello" ]
then
echo "$i Landon, language detected as English!"
else
echo "$i Landon, language detected as non English."
fi
done
-I標志將分隔符更改為換行符。
不帶引號的空格不會終止輸入項; 相反,分隔符是換行符。
你可以在這里閱讀它。
您必須手動將分隔符指定為空格。 Echo默認也會插入換行符,這會讓xargs變得混亂。 使用-n標志刪除換行符。
這是固定的命令:
echo -n "Hello Hola Bonjour" | xargs -d' ' -I _ echo _ Landon
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.