【问题标题】:bash sed with /^$/d;G commandbash sed 与 /^$/d;G 命令
【发布时间】:2024-01-20 16:54:02
【问题描述】:

我对 sed 有疑问:
假设 file.txt 中的内容是这样的:

one


two
three

然后我运行:

sed '/^$/d;G' file.txt

我觉得流程应该是这样的:

for line in file {
    pattern_space = line
    if (pattern_space == "\n") then pattern_space = ""
    pattern_space = pattern_space + "\n" + hold_space
    print pattern_space
}

所以,我认为结果应该是:(空白行未触及,非空白行后跟一行)

one



two

three

但是,现实是:

one

two

three

好像我已经运行了 sed '/^$/d' file.txt | sed G,我对此感到困惑。
你能告诉我什么是正确的过程吗?我有什么误解吗?
/br

【问题讨论】:

    标签: linux bash sed


    【解决方案1】:

    这是因为d 会立即结束该行的处理,而不是(默认)在脚本结束时打印。如果您想跳过脚本的其余部分但仍执行脚本结束操作,请改用b。默认的branch 目标是脚本结束。

    【讨论】:

    • 嗨,@jthill,我想问更多,拜托。从手册中说,“n N 读取/附加下一行输入到模式空间”,当我使用 n 时,为什么会打印出模式空间中的原始内容?例如,“sed 'n;d' file.txt”,这个命令只是切断偶数行。我认为应该没有什么可输出的,因为将下一行读入。 pattern_space 中的原始内容应该消失,但不是
    • 我不知道您从哪里获得该手册,the real one 说 --- n 如果未禁用自动打印,请打印图案空间,然后无论如何,更换模式空间与下一行输入。如果没有更多输入,则 sed 退出,不再处理任何命令