Awk 如何使用POSIX shell脚本删除文件的特定行?
我想删除,比如文件Awk 如何使用POSIX shell脚本删除文件的特定行?,awk,sed,sh,posix,ed,Awk,Sed,Sh,Posix,Ed,我想删除,比如文件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:表示根据您的帖子,在此处创建名为line的awk变量,其值为3 FNR=
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
:表示根据您的帖子,在此处创建名为line的awk
变量,其值为3
FNR==line
:如果行号(awk的开箱即用变量)值等于变量行值,则在此检查条件
{next}
:如果上述条件为真,则putting next将跳过所有进一步的语句,并且在输入文件的第3行上不会发生任何事情
1
:awk
使用条件和动作的方法,因此通过提及1
使条件为真,而不提及任何动作,因此默认情况下会打印行
如果您想将输出保存到同一个输入文件中,请将>临时文件和&mv临时文件输入文件附加到上述代码中
如果-i
选项不存在,则使用sed
sed '3d' Input_file > temp_file && mv temp_file Input_file
POSIXsed
页面:
一个略短的版本,然后拉文德他的脚本是:
awk '(FNR!=3)' input_file
awk程序由以下形式的成对程序组成:
pattern { action }
可以省略模式
或操作
(包括括号字符)。缺少的模式
应与任何输入记录匹配,缺少的操作
应等同于:{print}
在这种情况下,模式将检查文件的行号(FNR
)是否与3
不同。如果为true,则执行默认操作({print$0}
)
删除该行的内容如下:
$ awk '(FNR!=3)' input_file > tmp_file && mv tmp_file input_file
awk'NR=3{a[++nr]=$0}END{for(i=1;i FILENAME}'文件
我不确定是否符合POSIX,但可以建议使用ed
删除文件的第三行,如下所示:
echo $'3d\nwq' | ed -s YourFile
或者,也许
printf "3d\nwq\n" | ed -s YourFile
嗯,我已经知道了sed
命令。问题是,是否有一个命令可以完成这项工作,而不是用&
s或;
s将所有命令压缩在一行中。@LuisLavaire,既然你告诉-I
选项不起作用,那么这就是它的解决方法,我现在也添加了解释,让我解释一下知道吗?不是它不起作用:而是-i
标志是(特定的?)对于GNU的sed
。我需要使我的脚本与POSIX兼容。@LuisLavaire,因为我没有POSIXsed
,所以无法确认,但在搜索后,它似乎不在那里。请参见sed
,Awk不支持覆盖目标文件(尽管GNU Awk对此有一个选项);因此,这与没有的sed
有着相同的缺陷-i
'NR!=3'
会更短。@MarkSetchell我同意。我写FNR
是为了让人们意识到它的存在。它作为“记录的文件号”也更合适一些,而不是POSIX上不确定的总体“记录号”,但你能使用ed吗
?ed-s file@MarkSetchell太棒了!你能发布你的答案吗?那应该是被接受的答案。我不知道POSIX合规性,所以我宁愿在发布之前先看一下@CharlesDuffy…@MarkSetchell我很确定echo'3d\nwq'| ed-s file
是符合POSIX的。是否保证整个文件都符合POSIX标准在执行END
之前读取并关闭文件?可以保证读取整个文件,无论它是否关闭,考虑到我愿意花多少时间查看它,我在POSIX规范中都找不到。如果它尚未打开,也可以保证它将由
打开。printf
的使用应该是如果考虑到可移植性,则强烈建议使用echo
。$'…'
C样式字符串是Bash扩展,在POSIX中不受支持。@MarkSetchell我不需要使用$'…
。我只使用了echo'3d\nwq'| ed-s文件
@tripleee,为什么printf
比echo更受欢迎要求echo
支持\n
也不可移植。许多不兼容的echo
版本正是您应该使用printf
的原因,POSIX严格规定了这一点。(不过,在引号之间嵌入文字换行符也适用于所有版本的echo
)
printf "3d\nwq\n" | ed -s YourFile