我有 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
要考虑的选项是 ed
,printf '%sn'
将命令放在单独的行上:
lines=( 9 8 7 )
printf '%sn' "${lines[@]/%/d}" w | ed -s file
数组lines
包含要删除的行号;按降序排列这些行号很重要!扩展${lines[@]/%/d}
将d
(删除(命令添加到每个行号,并在末尾w
写入文件。您可以改为,p
,以便在覆盖文件之前检查输出。
顺便说一句,对于此示例,您也可以仅将7,9
用作数组中的单个条目。