我知道有些人可能会说解决方案是sed
,但它对我不起作用
所以,问题是我用read var
读取了一个var然后我想知道如何控制我的存档指定的列中是否存在该var,如果它不是只是不断询问请输入有效的代码,如果它的正确删除该行。感谢
CODE
read var
sed -i '/$var/d' file.txt
我想补充一些测试人员,以确认你是否提供了有效的代码。
文件的结构是
code;Name;Surname
答案 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