Bash

這個正則表達式是什麼意思?

  • November 17, 2013

我正在研究將 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。這將執行 command echo \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')"

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