Bash
正確轉義 / 在 sed 命令中
我正在嘗試製作一個腳本,它將第一個位置參數 in
$foo
並刪除 in 行之前的所有$foo
行files.txt
。但是我不斷收到以下錯誤:sed: -e expression #1, char 22: unknown command: f
. 我的輸入是recup_dir.6/f5681240.mpg
,我什至嘗試過逃避/
但recup_dir.6\/f5681240.mpg
沒有幫助。我還四處尋找不同的轉義文本方法,但沒有幫助。我的程式碼是:foo=$1; sed -i "0,/^file $foo$/d" files.txt
編輯:讓問題更清楚,說我有一個名為
files.txt
file ab/c file eg/f file hi/j file xy/z
現在我想刪除特定元素之前的所有元素 say
hij
,所以我使用了可以正常工作的命令sed -i '0,/^file hi\/j$/d' files.txt
。但是,當我嘗試將其用作上面顯示的腳本的一部分時,它會失敗。執行
./script.sh eg\/f
失敗並出現錯誤sed: -e expression #1, char 23: unknown command:
f'`謝謝
問題是您的字元串包含斜杠字元。當由 shell 注入到
sed
表達式中時,該字元會產生語法錯誤(它會提前結束正則表達式)。解決此問題的一種方法是確保每個都像您注入的字元串
/
一樣被轉義\/
,但這有點尷尬。另一種方法是使用在字元串中找不到的分隔符:foo=$1 sed -i "1,\:^file $foo$:d" files.txt
請注意,第一次出現的分隔符需要在表達式中進行轉義,這
0
通常不是范圍的有效開始。如果您還想輸出匹配的行:
foo=$1 sed -i "1,\:^file $foo$: { \:^file $foo$: p; d; }" files.txt
替代解決方案:
awk -v file="$foo" 'output; $0 == "file " file { output = 1 }' files.txt
如果變數
output
不為零或空白,則輸出每一行。1
每當一行file
後面跟著在命令行上給變數的字元串時,該變數就被設置為file
。如果您還想輸出匹配的行:
awk -v file="$foo" '$0 == "file " file { output = 1 }; output' files.txt