Bash 要替换的sed筛选器'';对于周期和'';对于行尾的时段

Bash 要替换的sed筛选器'';对于周期和'';对于行尾的时段,bash,unix,scripting,sed,end-of-line,Bash,Unix,Scripting,Sed,End Of Line,我想编写一个sed过滤器,将其输入中的所有句点更改为感叹号,除非句点位于一行末尾,在这种情况下,句点将替换为2个感叹号(即!!) 到目前为止,我的情况如下: sed -e 's/\./\!/g' -e 's/\!\n/\!\!\n/g' input_exp 其中,input_exp是一个文件,其中有几个句子。但该命令不起作用。“\n”在unix/bash中不是正确的行尾字符吗?在'\n'之前我需要额外的'\'吗 谢谢你的帮助 使用$表示正则表达式内部的“行结束”。使用$表示正则表达式内部的“行

我想编写一个sed过滤器,将其输入中的所有句点更改为感叹号,除非句点位于一行末尾,在这种情况下,句点将替换为2个感叹号(即!!)

到目前为止,我的情况如下:

sed -e 's/\./\!/g' -e 's/\!\n/\!\!\n/g' input_exp
其中,input_exp是一个文件,其中有几个句子。但该命令不起作用。“\n”在unix/bash中不是正确的行尾字符吗?在'\n'之前我需要额外的'\'吗


谢谢你的帮助

使用
$
表示正则表达式内部的“行结束”。

使用
$
表示正则表达式内部的“行结束”

sed -e 's_\.$_!!_g' -e 's_\._!_g' input_exp
为了提高可读性,我使用了
\uuu
而不是
/
。你也可以使用

sed -e 's/\.$/!!/g' -e 's/\./!/g' input_exp
当然,如果你愿意的话
\n
代表换行符,与行尾不同

为了提高可读性,我使用了
\uuu
而不是
/
。你也可以使用

sed -e 's/\.$/!!/g' -e 's/\./!/g' input_exp

当然,如果你愿意的话
\n
代表换行符,与行尾不同。

如果将该模式放在双引号中,则应转义美元符号。如果将该模式放在双引号中,则应转义美元符号。该模式应包含在单引号中,以防止变量插值和shell转义。这实际上不适用于双引号。:)@dannysauer:修复:-)我使用了Windows版本的sed。您在Windows命令提示符中没有奇特的*nix shell功能,因此单引号和双引号之间很少有区别;-)模式应该用单引号括起来,以防止变量插值和shell转义。这实际上不适用于双引号。:)@dannysauer:修复:-)我使用了Windows版本的sed。您在Windows命令提示符中没有奇特的*nix shell功能,因此单引号和双引号之间很少有区别;-)这方面的主要问题是,当您将模式放在单引号中时,\n没有被换行符替换-它被视为一个文本斜杠,然后是一个n。如果您将模式放在双引号中,那么您还需要转义!chars(您在这里做了不必要的事情):)下面使用$而不是a的答案是正确的。按照相反的顺序进行检查可能也会稍微快一点,如darioo的回答(因为每行只有一个替换,而不是两个)。不仅如此,而且原始代码的编写顺序将加倍
在一行的末尾,不管它过去是否是一个
。主要问题是当您将模式放在单引号中时,\n没有被换行符替换-它被视为一个文本斜杠,然后是一个n。如果您将模式放在双引号中,那么您还需要转义!chars(您在这里做了不必要的事情):)下面使用$而不是a的答案是正确的。按照相反的顺序进行检查可能也会稍微快一点,如darioo的回答(因为每行只有一个替换,而不是两个)。不仅如此,而且原始代码的编写顺序将加倍
在一行的末尾,不管它过去是否是