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

Bash Sed使用shell脚本变量删除文件中的选定行,bash,shell,awk,sed,Bash,Shell,Awk,Sed,我有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 这将

我有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 -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

另一个考虑的选项是<代码> ED<代码>,用<代码> Prtff '%s\n’/c>将命令放到单独的行:

lines=( 9 8 7 )
printf '%s\n' "${lines[@]/%/d}" w | ed -s file
数组
包含要删除的行号;重要的是要把它们按降序排列!扩展
${lines[@]/%/d}
向每个行号添加一个
d
(delete)命令,并在末尾写入文件。您可以改为
,p
,以在覆盖文件之前检查输出


另外,在本例中,您也可以将
7,9
用作数组中的单个条目。

您这样编写变量是因为您认为它很有用,还是因为它是另一个命令的输出?用不同的格式列出数字可能更方便。不,我只是按自己的方式写。因此,您可以使用您的方式删除特定的行号,这仅是因为在
)周围使用了锚定。