sed“$”不作为行尾字符

sed“$”不作为行尾字符

使用 Ubuntu 18 和 bash shell

“$”字符在 sed 中的行尾匹配中表现不正确。

当我尝试时:

sed '/^>/ s/$/_new/g' <file>

这将导致

>sometext_new

但我得到了

_newetext

这可能与这个问题有关: 在 Sed 命令中将行尾与 $ 匹配时出错 但那是使用 csh 并且有我没有的变量分配。

我尝试关闭 shell 扩展,set -f ;但是没有用

我努力了sed '/^>/ s/"$"/_new/g' <file>

这将 $ 变成文字字符,导致无法替换

我将非常感激任何帮助恢复 $ 作为 sed 中的行尾字符的先前行为

答案1

<file>几乎肯定有 Windows 风格 (CRLF) 的行结尾:

$ printf '>sometext\n' | sed '/^>/ s/$/_new/'
>sometext_new

$ printf '>sometext\r\n' | sed '/^>/ s/$/_new/'
_newetext

如果你想保留 CRLF 行尾,但在(Windows)EOL 处替换文本,你可以使用s/\r$/_new\r/

例如(通过管道cat -A使行尾明确)

$ printf '>sometext\r\n' | sed '/^>/ s/\r$/_new\r/' | cat -A
>sometext_new^M$

另一方面,如果你想将整个文件转换为 Unix 结尾,你可以使用

sed -e 's/\r$//' -e '/^>/ s/$/_new/'

dos2unix或者在使用之前用 转换文件sed

请注意,g当替换固定在模式的末尾(或开头)时,修饰符不起作用。

相关内容