Bash

xargs 的意外輸出

  • August 27, 2019

下面的語句應該列印 afc abc,但它會列印出來 abc abc 。我嘗試了很多次,但每次都是相同的結果不知道為什麼會發生這種情況,有人可以解釋並幫助我嗎?

echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}

是的,因為命令替換是由 shell 在xargs啟動之前執行的。替換中的echo列印字元串{}以供sed操作。sed沒有對其進行任何更改,結果是xargs看到

echo {} {}

反而:

echo 'abc' | xargs -I{} bash -c 'echo "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}

在這裡,我們通過將命令替換嵌入到內聯腳本中來防止 shell 評估命令替換。該腳本從命令行參數 ( abc) 中獲得xargs,並將其作為"$1".

printf如果您想a用破折號和其他字元替換將被解釋為以下選項的內容,則使用它會更好echo

echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}

或者,沒有sed

echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "${1//b/f}" "$1"' bash {}

或者,您可以sed單獨完成(至少在這個簡單的範例中):

echo 'abc' | sed 'h; s/b/f/g; G; s/\n/ /'

引用自:https://unix.stackexchange.com/questions/456395