我有shell脚本变量var="7,8,9"
这些是用于使用sed删除文件的行号。
我试过这里:
sed -i "$var"'d' test_file.txt
但是我得到了错误`sed:-e expression#1,char 4:unknown command:,'
还有其他方法可以删除该行吗?
答案 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)
另一个需要考虑的选项是SelectionChanged
,private 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
用作数组中的单个条目。