我想删除,说文件a
的第三行。如何使用sed
或awk
等工具以与 POSIX 规范兼容的方式执行此操作?我知道我可以做sed -i '3d' a
,但是 POSIX 没有为sed
指定-i
标志。
当然,我可以运行没有-i
标志的相同sed
命令,保存到临时文件,然后用新文件替换原始文件;但我更喜欢单行。
以下内容可能会有所帮助。
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 行不会发生任何事情。
1
:awk
在条件和操作方法上工作,因此通过将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
一个稍短的版本,然后是Ravinder他的脚本是:
awk '(FNR!=3)' input_file
awk 程序由以下形式的对组成:
pattern { action }
可以省略pattern
或action
(包括大括号字符)。缺失的pattern
应与任何输入记录相匹配,缺失的action
应等同于:{ print }
。
在这种情况下,pattern
状态检查文件的行号(FNR
)是否与3
不同。如果为 true,则执行默认操作 ({print $0}
)。
删除该行的内容为:
$ awk '(FNR!=3)' input_file > tmp_file && mv tmp_file input_file
我不确定 POSIX 合规性,但可以建议使用ed
删除文件的第三行,如下所示:
echo $'3dnwq' | ed -s YourFile
或者,也许
printf "3dnwqn" | ed -s YourFile
awk 'NR!=3{a[++nr]=$0} END{for (i=1;i<=nr;i++) print a[i] > FILENAME}' file