我在名为file.txt
的文件中有类似的内容AA.201610.pancake.Paul
AA.201610.hello.Robert
A.201610.hello.Mark
现在,我只获得3个变量中的前三个字段,如:
field1="A"
field2="201610"
field3='hello'.
我想删除一行,如果它包含前三个字段,例如,在上述情况下,我只想从file.txt中删除第三行。有没有办法做到这一点?有没有办法在同一个文件中执行此操作? 我尝试过:
sed -i /$field1"."$field2"."$field3"."/Id file.txt
但当然这会删除第二行和第三行
答案 0 :(得分:4)
我建议使用awk
,因为sed
只能执行正则表达式搜索,并且需要转义所有特殊元字符和锚点,字边界等以避免错误匹配。
建议使用非正则表达式匹配的awk:
awk -F '[.]' -v f1="$field1" -v f2="$field2" -v f3="$field3" '
!($1==f1 && $2==f2 && $3==f3)' file
AA.201610.pancake.Paul
AA.201610.hello.Robert
答案 1 :(得分:2)
使用^
将模式锚定在行的开头。另请注意,正则表达式中的.
表示“任何字符”,而不是文字的peridio。你必须逃避它:\.
(小心shell转义以及单引号和双引号之间的区别)或[.]
答案 2 :(得分:1)
sed不能进行字符串匹配,只有regexp匹配,当你只想匹配一个文字字符串时,这会变得非常复杂(参见Is it possible to escape regex metacharacters reliably with sed)。只需使用awk:
$ awk -v str="${field1}.${field2}.${field3}." 'index($0,str)!=1' file
AA.201610.pancake.Paul
AA.201610.hello.Robert
答案 3 :(得分:0)
关于bash
的问题是bash
:
#!/usr/bin/env bash
field1="A"
field2="201610"
field3='hello'
IFS=
while read -r i
do
case "$i" in
"${field1}.${field2}.${field3}."*) ;;
*) echo -E "$i"
esac
done < file.txt