Sed 使用 shell 脚本变量将选定的行删除到文件中



我有 shell 脚本变量var="7,8,9" 这些是用于使用 sed 删除到文件的行号。

在这里我尝试了: sed -i "$var"'d' test_file.txt

但是我得到错误'sed:-e 表达式 #1,字符 4:未知命令:,'

还有其他方法可以删除该行吗?

sed命令不接受逗号分隔的行号。

您可以使用此awk命令,该命令使用 bit if BASH 字符串操作来形成具有给定逗号分隔行号的正则表达式:

awk -v var="^(${var//,/|})$" 'NR !~ var' test_file.txt

这会将 awk 变量var设置为以下正则表达式:

^(7|8|9)$

然后条件NR !~ var确保我们只打印那些与正则表达式上方不匹配的行。

对于内联编辑,如果您使用版本 > 4.0 gnu-awk,请使用:

awk -i inplace -v var="^(${var//,/|})$" 'NR !~ var' test_file.txt

或者对于较旧的awk使用:

awk -v var="^(${var//,/|})$" 'NR !~ var' test_file.txt > $$.tmp && mv $$.tmp test_file.txt

我喜欢sed,你离它很近。您只需要将每个行号拆分为一个单独的命令。这个怎么样:

sed -e "$(echo 1,3,4 | tr ',' 'n' | while read N; do printf '%dd;' $N; done)"
这样做

sed -i "`echo $var|sed 's/,/d;/g'`d;" file
另一个

要考虑的选项是 edprintf '%sn'将命令放在单独的行上:

lines=( 9 8 7 )
printf '%sn' "${lines[@]/%/d}" w | ed -s file

数组lines包含要删除的行号;按降序排列这些行号很重要!扩展${lines[@]/%/d}d(删除(命令添加到每个行号,并在末尾w写入文件。您可以改为,p,以便在覆盖文件之前检查输出。

顺便说一句,对于此示例,您也可以仅将7,9用作数组中的单个条目。

最新更新