2

我想删除,比如文件的第三行a。如何使用类似 POSIX 规范的工具sedawk以与 POSIX 规范兼容的方式来做到这一点?我知道我可以做到sed -i '3d' a,但-iPOSIX 没有为sed.

当然,我可以在sed没有标志的情况下运行相同的命令-i,保存到一个临时文件,然后用新文件替换原始文件;但我更喜欢单线。

4

4 回答 4

2

以下可能会有所帮助。

awk -v line=3 'FNR==line{next} 1' Input_file

解释:

-v line=3:意味着awk根据您的帖子在此处创建名为 line 的变量,其值为 3。

FNR==line:如果行号(awk 的开箱即用变量)值等于变量行值,则在此处检查条件。

{next}:如果上面提到的条件为 TRUE,那么输入 next 将跳过所有进一步的语句,并且 Input_file 的第 3 行不会发生任何事情。

1awk适用于条件和动作的方法,因此通过1将条件设置为 TRUE 并且不提及任何动作,因此默认情况下会打印行。

如果您想将输出保存到相同的 Input_file 本身,那么> temp_file && mv temp_file Input_file也可以附加到上面的代码中。


sed以防万一-i选项不存在。

sed '3d' Input_file > temp_file && mv temp_file Input_file

POSIXsed页面:

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html

于 2018-07-13T15:45:11.207 回答
2

一个略短的版本,然后拉文德他的脚本是:

awk '(FNR!=3)' input_file

一个 awk 程序由以下形式的对组成:

pattern { action }

可以省略thepattern或 the action(包括括号字符)。缺失pattern应与输入的任何记录相匹配,缺失action应等同于:{ print }.

pattern这种情况下,状态检查文件 ( FNR) 的行号是否不同于3. 如果为 true,则执行默认操作 ( {print $0})。

该行的删除将显示为:

$ awk '(FNR!=3)' input_file > tmp_file && mv tmp_file input_file
于 2018-07-13T16:54:34.153 回答
1
awk 'NR!=3{a[++nr]=$0} END{for (i=1;i<=nr;i++) print a[i] > FILENAME}' file
于 2018-07-13T20:59:39.940 回答
1

我不确定 POSIX 合规性,但可以建议使用ed删除文件的第三行,如下所示:

echo $'3d\nwq' | ed -s YourFile

或许

printf "3d\nwq\n" | ed -s YourFile
于 2018-07-16T10:17:21.150 回答