如何在bash中删除包含变量的行?

时间:2016-05-30 15:57:47

标签: bash shell

我知道有些人可能会说解决方案是sed,但它对我不起作用 所以,问题是我用read var读取了一个var然后我想知道如何控制我的存档指定的列中是否存在该var,如果它不是只是不断询问请输入有效的代码,如果它的正确删除该行。感谢

CODE

read var
sed -i '/$var/d' file.txt

我想补充一些测试人员,以确认你是否提供了有效的代码。

文件的结构是

code;Name;Surname

4 个答案:

答案 0 :(得分:1)

没有空格或奇数位可以解析,所以 sed 不需要单引号:

read var
sed -i /"$var"/d file.txt

一个演示 - 制作一个从1到3的列表,删除2:

seq 3 > three.txt; var=2; sed -i /"$var"/d three.txt ; cat three.txt

输出:

1
3

答案 1 :(得分:0)

以下使用awk搜索并删除第一列为$code的行。如果删除了一行,则awk将成功退出,并将调用break

file="input_file"
while :; do
  echo "Enter valid code:"
  read -r code
  [ -n "$code" ] || continue
  awk -F';' -v c="$code" '$1 == c {f=1;next}1;END{exit(f?0:1)}' \
  "$file" > "$file.out" && break
done
mv "$file.out" "$file"

这将继续在$file中请求代码,直到用户输入有效代码,此时创建$file.out并且迭代被破坏。

然后file.out重命名为file。技术上每次都会创建$file.out

答案 2 :(得分:0)

您可以使用

扩展$var${var}
read var
sed -i '/'${var}'/d' file.txt

但是当$var有空格时会发生什么?没什么好的,所以也要使用双引号:

read var
sed -i '/'"${var}"'/d' file.txt

答案 3 :(得分:0)

我在下面的文件中尝试使用awk:

$cat test.txt
code;Name;Surname
xyz;n1;s1
abc;dd;ff
xyz;w;t
abc;ft;op

它将打印要删除的行。但是我无法弄清楚如何在打印信息后从awk中删除该行。

$var=xyz | awk -v var="$var" -F ";" '{ if ($1 == var ) print "FOUND " var " And Going to delete the line" NR " " $0  ; }' test.txt 
FOUND xyz And Going to delete the line2 xyz;n1;s1
FOUND xyz And Going to delete the line4 xyz;w;t

下面的命令将显示信息并删除日期。但它需要解析输入文件。

$var=xyz | awk -v var="$var" -F ";" '{ if ($1 == var ) print "FOUND " var " And Going to delete the line" NR " " $0  ; }' test.txt && awk -v var="$var" -F ";" '($1 != var)' test.txt > _tmp_  && mv _tmp_ test.txt
FOUND xyz And Going to delete the line2 xyz;n1;s1
FOUND xyz And Going to delete the line4 xyz;w;t

删除后的新文件:

$cat test.txt
code;Name;Surname
abc;dd;ff
abc;ft;op