Linux

sed 在從 echo 但不是從文件輸入時有效

  • January 18, 2017

以下內容刪除了電子郵件地址字元串的引號:

$ echo  "john.doe@gmail.com" | sed 's/"([^"]*)"/\0/g'  
john.doe@gmail.com  

但如果:

$ cat ~/Desktop/emails.txt 
"john.doe@gmail.com"  
$ sed 's/"([^"]*)"/\0/g' ~/Desktop/emails.txt    
"john.doe@gmail.com"   
$ sed -i '' 's/"([^"]*)"/\0/g' ~/Desktop/emails.txt
$ cat ~/Desktop/emails.txt 
"john.doe@gmail.com"  

嘗試使用包含相同字元串的文件應用完全相同的 sed 正則表達式替換不起作用。

我究竟做錯了什麼?

很抱歉,您的echo範例不起作用。它似乎有效,因為雙引號 ( ") 被解釋bash並且從未傳遞給sed.

請注意以下兩個範例之間的區別:

$ echo "john.doe@gmail.com" 
john.doe@gmail.com
$ echo "\"john.doe@gmail.com\"" 
"john.doe@gmail.com"

您的echo命令沒有提供"to,因此它似乎可以工作,因為輸入字元串sed中沒有要刪除的內容。"

如果您嘗試正確轉義",該echo範例將無法作為file範例工作:

$ echo  "\"john.doe@gmail.com\"" | sed 's/"([^"]*)"/\0/g'  
"john.doe@gmail.com"

sed的命令有兩個錯誤:

  1. 您正在使用擴展的正則表達式語法。只有有gnused 才能使用它。不同之處在於他們使用括號的方式。
  2. 您必須從 . 開始計算反向引用1

所以正確的命令是:

echo  "\"john.doe@gmail.com\"" | sed 's/"\([^"]*\)"/\1/g' 

或者,如果您sed支持擴展正則表達式:

echo "\"john.doe@gmail.com\"" | sed -E 's/"([^"]*)"/\1/g'

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