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
POSIX
sed
页面:


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

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,因为我没有POSIX
sed
,所以无法确认,但在搜索后,它似乎不在那里。请参见
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