這個正則表達式是什麼意思?
我正在研究將 Unix 換行符轉換為 Windows 換行符。我嘗試使用 unix2dos 但它給了我一些二進制錯誤,所以我查了一下並偶然發現了這個正則表達式
sed 's/$'"/`echo \\\r`/" input.txt > output.txt
這個正則表達式正在工作,但我不知道,它是如何工作的?顯然我試圖通過這種形式來解釋它
sed 's/a/b/'
這裡
a 指的是 $’" 我不明白。
而 b 指
echo \\\r
的是 ‘\r’另外我不明白為什麼/如何使用單引號和雙引號的組合?誰能向我解釋這個正則表達式?
沒有
$'"
's/$'"/`echo \\\r`/" == "s/\$/`echo \\\r`/"
但是正則表達式的作者只是喜歡
$
通過單引號來逃避。您可以以任何您喜歡的方式組合這種轉義。
所以你的正則表達式它只是附加
\r
到行尾。更新。最初從問題中並不清楚它使用
echo \\\r
而不僅僅是echo \\r。沒有必要在echo
這裡使用。您可以直接在 sed 中執行此操作:但是's/$/\r/'
這是一些複雜的引用。to 的論點
sed
由兩部分組成。首先,有's/$'
一個單引號字元串文字,產生字元s/$
。然後是一個雙引號字元串,其中包含命令替換echo \\\r
。這將執行 commandecho \r
,這取決於 shell 列印\r
或 CR 字元。(列印的文本echo
以換行符結尾,但命令替換會吃掉它。)為了使該命令具有預期的效果,您必須在echo \r
列印 CR 字元的系統上,我將在此處表示為␍
.因此 sed 的論點是
s/$/␍/
。$
這將用字元串替換正則表達式的每個匹配項␍
。正則表達式$
匹配空字元串,但僅在行尾匹配,因此此 sed 命令將 CR 附加到每一行。由於 Unix 行以 LF 結尾,而 Windows 行以 CR+LF 結尾,這會將 Unix 行結尾轉換為 Windows 行結尾。GNU sed,但不是其他版本,理解反斜杠轉義,例如
\r
. 所以使用 GNU sed 你可以編寫sed 's/$/\r/'
. 但是,這不適用於其他 sed 實現(BSD、Solaris 等)。echo \r
也不是很便攜。一個可移植的解決方案是使用tr
,它以反斜杠轉義為標準。sed "$(echo 's/$/@/' | tr '@' '\r')"