[英]How to get only lines with a single quote using GNU sed in Bash shell?
[英]Bash quote behavior and sed
我寫了一個簡短的bash腳本,它應該從字符串中去掉前導標簽/空格:
#!/bin/bash
RGX='s/^[ \t]*//'
SED="sed '$RGX'"
echo " string" | $SED
它可以從命令行運行,但腳本會收到此錯誤:
sed: -e expression #1, char 1: unknown command: `''
我的猜測是引號有問題,但我不確定是什么。
確實如此。 嘗試:
#!/bin/bash
RGX='s/^[ \t]*//'
#SED='$RGX'
echo " string" | sed "$RGX"
這有效。
你遇到的問題是引號和空格。 雙引號字符串作為單個參數傳遞。
將set -x
添加到腳本中。 您將看到單引號內的變量未展開。
將命令放入變量並將它們完整地取出是很困難的,因為引用不按預期方式工作(參見BashFAQ#050,“我試圖將命令放在變量中,但復雜的情況總是失敗!” )。 有幾種方法可以解決這個問題:
1)除非你真的需要,否則不要這樣做。 說真的,除非你有充分的理由將命令放在變量中,否則執行它並不處理這種混亂。
2)除非你真的 真的需要,否則不要使用eval
。 eval
作為令人討厭和模糊的錯誤的來源享有當之無愧的聲譽。 如果你足夠了解它們並采取必要的預防措施來避免它們,就可以避免它們,但這應該是最后的手段。
3)如果你真的必須在一個點定義一個命令並在以后使用它,要么將它定義為函數或數組。 以下是使用函數執行此操作的方法:
RGX='s/^[ \t]*//'
SEDCMD() { sed "$RGX"; }
echo " string" | SEDCMD
這是陣列版本:
RGX='s/^[ \t]*//'
SEDCMD=(sed "$RGX")
echo " string" | "${SEDCMD[@]}"
成語"${SEDCMD[@]}"
允許您擴展數組,將每個元素保持為單獨的單詞,而不會出現任何問題。
+要擴展我上面的評論:
#!/bin/bash
RGX='s/^[[:space:]]+//'
SED="sed -r '$RGX'"
eval "printf \" \tstring\n\" | $SED"
請注意,這也使得你的正則表達式是一個擴展的,沒有特別的原因。 :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.