在sed脚本中清空正则表达式

时间:2013-06-16 18:36:45

标签: shell unix sed ksh

找到以下sed脚本来反转每行中的字符,来自着名的“sed one liners”,我无法在脚本的 // D 中遵循以下命令

sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

假设初始文件有两行开头说,

apple
banana

在第一个命令之后,

/\n/!G

模式空间将是,

apple

banana

[每行后引入的新行。代码标记在此删除最后一个新行。所以没有显示]。 在第二个命令之后,

s/\(.\)\(.*\n\)/&\2\1/

模式空间将是,

apple
pple
a
banana
anana
b

此后第三个命令如何工作?另外,我理解empty regular expression(//)与先前匹配的正则表达式匹配。但在这种情况下,会是什么? \ n从第一个命令或由第二个命令替换的正则表达式?任何帮助将非常感激。感谢。

2 个答案:

答案 0 :(得分:3)

使用my own comment above中的建议 这就是:

/\n/!G模式空间后

apple¶
banana¶

s/\(.\)\(.*\n\)/&\2\1/模式空间后

apple¶pple¶a
banana¶anana¶b
然后是D命令。来自man sed

   D      Delete  up  to  the first embedded newline in the pattern space.
          Start next cycle, but skip reading from the input  if  there  is
          still data in the pattern space.

因此删除了第一个单词和第一个。然后sed从 第一个命令但由于模式空间包含模式/\n/ 不匹配,不执行G命令​​。 第二个命令导致

pple¶ple¶pa
anana¶nana¶ab
你可以继续吗?

答案 1 :(得分:0)

D表示删除第一行(直到第一行\ n),如果缓冲区中仍有某些内容,则重新启动当前周期 //是以前模式匹配的快捷方式(重复使用最后一个模式进行搜索)

$ echo "123" | sed -n 's/2/other/;// p'
$

没有对应的(因为它改变了模式匹配内容)

$ echo "123" | sed -n 's/.2/&still/;// p'
12still3
$

使用.2时也会找到模式// p,因为它等同于/.2/ p

相关问题