簡體   English   中英

將回聲輸出管道輸入xargs

[英]Piping echo output into xargs

我正試圖通過xargs管道一個值列表。 這是一個簡單的例子:

echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon

我希望這會輸出以下內容:

Hello Landon
Hola Landon
Bonjour Landon

相反,該命令輸出:

Hello Hola Bonjour Landon

我錯過了什么?

-Iman 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM