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

时间:2017-05-26 10:29:34

标签: bash shell awk sed

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

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

但是我得到了错误`sed:-e expression#1,char 4:unknown command:,'

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

4 个答案:

答案 0 :(得分:1)

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

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

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

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

^(7|8|9)$

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这样做:

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

答案 3 :(得分:0)

另一个需要考虑的选项是SelectionChangedprivate void logListActions_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems != null && e.AddedItems.Count > 0) { Dispatcher.BeginInvoke(new Action(() => { ListViewItem lvi = logListActions.ItemContainerGenerator.ContainerFromItem(e.AddedItems[0]) as ListViewItem; if (lvi != null) lvi.Focus(); }), System.Windows.Threading.DispatcherPriority.Background); } } 将命令放到不同的行上:

ed

数组printf '%s\n'包含要删除的行号;将这些重要放在降序中!扩展lines=( 9 8 7 ) printf '%s\n' "${lines[@]/%/d}" w | ed -s file 向每个行号添加lines(删除)命令,最后${lines[@]/%/d}写入文件。您可以将其更改为d,以便在覆盖文件之前检查输出。

除此之外,对于此示例,您还可以将w用作数组中的单个条目。