使用 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
当替换固定在模式的末尾(或开头)时,修饰符不起作用。