Xargs

為什麼 xargs 會從輸入中去除引號?

  • October 14, 2021

為什麼 xargs 會從輸入文本中去除引號?

這是一個簡化的範例:

echo "/Place/='http://www.google.com'" | xargs echo

輸出

/Place/=http://www.google.com

有沒有辦法解決這個問題?(xargs -0 對我沒有幫助)

如果你想xargs忽略引號,一個好的靈魂可以是使用xargs標誌xargs -0

直接從手冊頁選項

選項 -0, –null

輸入項以空字元而不是空格結尾,並且引號和反斜杠不是特殊的(每個字元都按字面意思表示)。禁用文件字元串的結尾,它被視為任何其他參數。當輸入項可能包含空格、引號或反斜杠時很有用。GNU find -print0 選項產生適合這種模式的輸入。

-d我已經在 GNU 系統上檢查過,使用選項(而不僅僅是)將分隔符設置為特定值(如換行符)-0也會導致xargs不特別對待引號等:

-bash-4.3$ { echo "a'b'c"; echo d; } | xargs -d$'\n' echo
a'b'c d
-bash-4.3$ rpm -qf "$(which xargs)"
findutils-4.6.0.0.99.11a05-alt1.x86_64
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs echo
abc d
-bash-4.3$ 

對於 GNU xargs,我在手冊頁中找到了另一個解決方案:明確指定分隔符為 ‘\n’。這將關閉對引號的特殊處理:

–delimiter = 共享,-d 共享

輸入項以指定字元結束。指定的分隔符可以是單個字元、C 樣式的字元轉義符(例如 \n)或八進製或十六進制轉義碼。八進制和十六進制轉義碼被理解為用於 printf 命令。不支持多字節字元。在處理輸入時,引號和反斜杠並不特殊;輸入中的每個字元都是按字面意思理解的。

所以,

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

輸出

/Place/='http://www.google.com'

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