如何使用 POSIX shell 脚本删除文件的特定行?
How to delete an specific line of a file using POSIX shell scripts?
我想删除文件 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
: 表示根据你的post.
创建awk
变量名为line 其值为3 这里
FNR==line
:如果行号(awk 开箱即用的变量)值等于变量行值,则在此处检查条件。
{next}
:如果上面提到的条件为真,那么放置 next 将跳过所有进一步的语句,并且 Input_file.
的第 3 行不会发生任何事情
1
:awk
处理条件和操作的方法,因此通过提及 1
使条件为真而不提及任何操作,因此默认情况下会打印行。
如果您想将输出保存到相同的 Input_file 本身,那么也将 > temp_file && mv temp_file Input_file
附加到上面的代码。
或者使用 sed
以防 -i
选项不存在。
sed '3d' Input_file > temp_file && mv temp_file Input_file
POSIX sed
页数:
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 [=21=]}
)。
该行的删除将显示为:
$ awk '(FNR!=3)' input_file > tmp_file && mv tmp_file input_file
awk 'NR!=3{a[++nr]=[=10=]} END{for (i=1;i<=nr;i++) print a[i] > FILENAME}' file
我不确定 POSIX 合规性,但可以建议使用 ed
删除文件的第三行,如下所示:
echo $'3d\nwq' | ed -s YourFile
或者,也许
printf "3d\nwq\n" | ed -s YourFile
我想删除文件 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
: 表示根据你的post.
awk
变量名为line 其值为3 这里
FNR==line
:如果行号(awk 开箱即用的变量)值等于变量行值,则在此处检查条件。
{next}
:如果上面提到的条件为真,那么放置 next 将跳过所有进一步的语句,并且 Input_file.
1
:awk
处理条件和操作的方法,因此通过提及 1
使条件为真而不提及任何操作,因此默认情况下会打印行。
如果您想将输出保存到相同的 Input_file 本身,那么也将 > temp_file && mv temp_file Input_file
附加到上面的代码。
或者使用 sed
以防 -i
选项不存在。
sed '3d' Input_file > temp_file && mv temp_file Input_file
POSIX sed
页数:
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 [=21=]}
)。
该行的删除将显示为:
$ awk '(FNR!=3)' input_file > tmp_file && mv tmp_file input_file
awk 'NR!=3{a[++nr]=[=10=]} END{for (i=1;i<=nr;i++) print a[i] > FILENAME}' file
我不确定 POSIX 合规性,但可以建议使用 ed
删除文件的第三行,如下所示:
echo $'3d\nwq' | ed -s YourFile
或者,也许
printf "3d\nwq\n" | ed -s YourFile