2012-05-09 189 views
2

我有一堆文件的结尾是这样的句子:\@.Next sentence。我想在这段时间后插入一个空格。使用sed后插入空格

然而,并非所有的\@.都没有空格,所以我的正则表达式检查该句点后的下一个字符是否是大写字母。

因为我正在查看一段时间后的一个字符,所以我不能仅仅更换\@.\@.,并且因为我不知道在这段时间后是什么字符,所以我被卡住了。

我现在命令:

sed -i .bak -E 's/\\@\.[A-Z]/<SOMETHING IN HERE>/g' *.tex 

我怎么能抢匹配字符串中的正则表达式替换使用的最后一个字母?我使用的是BSD版本sed(我使用的是OS X) - 从我的previous question regarding sed,显然BSD sed(或者至少是苹果版本)并不总是很好玩用GNU sed正则表达式。

回答

3

正确的命令应该是这样的:

sed -i.bak -E "s/\\\@.(\S)/\\\@. \1/g" *.tex 

蒙山,你匹配任何\@后跟非空格(\S),并插入一个空白(用'\@ '加上了更换整个比赛是什么做非空白空间刚刚找到)。

+0

这似乎不起作用:'echo'\ @。N | \ @。 Q'| sed -E's \\\\ @。(\ S)/ \\\ @。 \ 1/g''返回'\ @。N | \ @。 Q'(期待'\ @。N | \ @。Q';没有插入空格)。 – simont

+0

奇怪,因为我得到了期望的结果。我正在运行sed 4.2.1。哪个版本是你的? –

+0

使用'gsed'你是对的;这确实有用。谢谢 – simont

0

我认为以下是正确的:

s/\\@\.[^\s]/\\@. /g 

只更换表情,如果不是后面有一个空格。

+0

这似乎不起作用:'echo'\ @。N | \ @。 Q'| sed -E's/\ @。[^ \ s]/\ @。/g''给我'\ @。 | \ @。 Q'(咀嚼N)。 – simont

1

使用此sed命令:

sed -i.bak -E 's/(\\@\.)([A-Z])/\1 \2/g' *.tex 

或更好:

sed -i.bak -E 's/(\\@\.)([^ \t])/\1 \2/g' *.tex 

将插入空间,如果\@.后面没有任何空白字符(不仅是大写字母)。

0

这可能会为你工作:

sed -i .bak -E 's/\\@\. \?/\\@. /g' *.tex 

说明:

如果有一个空间,有一个空格替换它,否则插入空格。