Linux Bash。如果字段完全匹配,请删除行

时间:2016-04-30 08:48:52

标签: linux bash sed

我在名为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

但当然这会删除第二行和第三行

4 个答案:

答案 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