【问题标题】:Empty regular expression in sed scriptsed 脚本中的空正则表达式
【发布时间】:2013-06-12 18:03:51
【问题描述】:

从著名的“sed one liners”中找到以下 sed 脚本来反转每一行中的字符,但我无法在脚本的 //D 中执行以下命令

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

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

apple
banana

在第一个命令之后,

/\n/!G

模式空间是,

apple

banana

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

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

模式空间是,

apple
pple
a
banana
anana
b

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

【问题讨论】:

  • 我建议进行 2 次编辑:在顶部的脚本中将 ; 替换为换行符,以便每个命令位于单独的行上,这样会更清晰。在每个命令之后的中间状态中,将嵌入模式空间中的换行显示为,以将它们与输入中已经存在的换行区分开来(也可以解决代码标记问题)

标签: shell unix sed ksh


【解决方案1】:

使用来自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

你能从那里继续吗?

【讨论】:

  • // 之前的地址D ?
  • @user829755:Neato。感谢您的解释。我想知道为什么在第一个命令中为 G 打扰 /\n/ 。这解释得很清楚。
  • @captcha: // 将采用 (.)(.*\n) 匹配第二个命令。这是有道理的,因为它符合 user829755 的解释。
【解决方案2】:

D 表示删除第一行(直到第一行\n),如果缓冲区中还有东西,则重新开始当前循环 // 是先前模式匹配的快捷方式(重复使用最后一个模式进行搜索)

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

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

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

当使用// p 时也会发现模式.2,因为它等同于/.2/ p

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多