这个正则表达式是什么意思?

这个正则表达式是什么意思?

我正在研究 Unix 换行符到 Windows 换行符的转换。我尝试了 unix2dos 但它给了我一些二进制错误,所以我查了一下并偶然发现了这个正则表达式

sed 's/$'"/`echo \\\r`/" 输入.txt > 输出.txt

这个正则表达式正在工作,但我不知道它是如何工作的?显然我试图通过这种形式来解释它

sed 's/a/b/'

这里

a 指的是 $'" 我不明白。
b 指echo \\\r的是 '\r'

我也不明白为什么/如何使用单引号和双引号的组合?谁能给我解释一下这个正则表达式吗?

答案1

没有$'"

's/$'"/`echo \\\r`/" == "s/\$/`echo \\\r`/"

但正则表达式作者只是喜欢$通过单引号转义。

您可以按照您喜欢的任何方式组合此类转义。

所以你的正则表达式只是附加\r到行尾。

更新。最初,问题并不清楚它使用“echo \\\r”而不仅仅是 echo \\\r。这里没有必要使用echo。你可以直接在 sed 中执行:

sed 's/$/\r/'

答案2

这是一些复杂的引用。的论证sed由两部分组成。首先,有's/$'一个单引号字符串文字,产生字符s/$。然后是一个双引号字符串,其中包含命令替换`echo \\\r`。这将运行命令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')"

相关内容