Linux
sed 在從 echo 但不是從文件輸入時有效
以下內容刪除了電子郵件地址字元串的引號:
$ 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
的命令有兩個錯誤:
- 您正在使用擴展的正則表達式語法。只有有
gnu
sed 才能使用它。不同之處在於他們使用括號的方式。- 您必須從 . 開始計算反向引用
1
。所以正確的命令是:
echo "\"john.doe@gmail.com\"" | sed 's/"\([^"]*\)"/\1/g'
或者,如果您
sed
支持擴展正則表達式:echo "\"john.doe@gmail.com\"" | sed -E 's/"([^"]*)"/\1/g'