3

从著名的“sed one liners”中找到以下 sed 脚本来反转每一行中的字符,但我无法在脚本的//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

在此之后第三个命令如何工作?另外,我了解空正则表达式(//)与先前匹配的正则表达式匹配。但在这种情况下,那会是什么?\n 来自第一个命令还是被第二个命令替换的正则表达式?任何帮助将非常感激。谢谢。

4

2 回答 2

3

使用上面我自己的评论中的建议 会发生以下情况:

/\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 从第一个命令开始,但由于模式空间包含 a模式/\n/ 不匹配并且不执行 G 命令。第二个命令导致

pple¶ple¶pa
anana¶nana¶ab

你能从那里继续吗?

于 2013-06-16T20:01:40.240 回答
0

D意思是删除第一行(直到第一个 \n)并重新启动当前循环,如果缓冲区中仍有某些 // 内容是先前模式匹配的快捷方式(重用最后一个模式进行搜索)

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

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

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

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

于 2013-12-13T06:42:32.780 回答