sed 复杂脚本

sed 复杂脚本

我试图理解这个很好的答案这解释了如何使用sed.

我构建了一些测试数据

printf "Line #%2d\n" {1..7} >file

然后运行

sed -e \$$'{w/dev/stdout\n;d}' -i~ file

我正在尝试找出这个sed命令。到目前为止我想到的是:

  1. -e

-e script, --expression=script 将脚本添加到要执行的命令中。

  1. 这个答案解释关于/dev/stdout.

  2. \n表示换行符

  3. -i~

-i[后缀], --in-place[=后缀]

就地编辑文件(如果提供扩展名,则进行备份)。

我还是无法理解。

答案1

第一个命令创建一个包含七行文本的文件。该数据用于所以答案为了说明该命令的效果sed,它被写入一个名为file.

$'...'给定一个能够理解(“C 字符串”)并且您使用 GNU sed(理解d}为)的 shell d;},第二个命令将在标准输出上返回测试数据文件的最后一行,并将其从文件中删除,从而备份原始数据(file~备份原始数据就是file~这样-i~做的)。

在SO答案中,sed编辑脚本在命令行上编写为

\$$'{w/dev/stdout\n;d}'

这是一个文字$,后跟一个“C 字符串”,$'{w/dev/stdout\n;d}'。 C 字符串引用意味着\n将扩展为文字换行符,这给出了

${w/dev/stdout
;d}

...这是一种草率的脚本编写sed方式

$ {
    w /dev/stdout
    d
}

sed编辑脚本将除最后一行之外的所有内容原封不动地传递到输出(file由于-i使用了该选项,该脚本将进入文件)。

最后一行使用该命令写入/dev/stdout而不是写入默认输出(在本例中) ,然后使用 删除。filewd

效果是,除了最后一行之外的所有行都保留在(写回),file而最后一行在标准输出上生成(将连接到您的终端)。

答案2

您对您提出的问题得到了很好的回答,但仅供参考,“如何使用 sed 对文件实施命令”的最佳答案pop是“不要这样做”。我希望这个问题如果没有因为不清楚而迅速结束的话,将会得到答案。

以下使用 GNU awk 而不是您当前使用的 GNU sed,将在任何 shell 中工作,并且希望更容易理解:

$ awk -i inplace 'NR>1{print prev} {prev=$0} END{if (NR) print prev}' file
Line # 7

$ cat file
Line # 1
Line # 2
Line # 3
Line # 4
Line # 5
Line # 6

https://www.gnu.org/software/gawk/manual/gawk.html#Extension-Sample-Inplace有关使用 GNU awk 进行“就地”编辑的更多信息。

相关内容