Bash

正確轉義 / 在 sed 命令中

  • October 6, 2022

我正在嘗試製作一個腳本,它將第一個位置參數 in$foo並刪除 in 行之前的所有$foofiles.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

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