我想删除文件中包含单词“test”的所有行,但是如果该行包含“test @”,那么我不想删除它。

使用sed可能有一些时髦的方法,但是我很挣扎,我尝试使用sed编写bash循环,但这可能很愚蠢。

filetest=/tmp/filetest
filetest_tmp=/tmp/filetest.tmp<
line_num=0

while read line; do
        line_num=$(($line_num+1))
        if [[ $line == *rootsh* ]] && [[ $line != *root@* ]]
                then
                sed -e "${line_num}"'d' $filetest >> $filetest_tmp
        fi
done < $filetest
cp $syslog_tmp $filetest

如您所知,我是新手:(

最佳答案

sed -e '/test/{/test@/!d;}'

第一个模式匹配包含“test”的行;第二种模式将删除行,除非它们与“test @”匹配。

在数据文件上进行了测试:
aaaa
bbbtestbbb
ccctest@ccc
test!
dddd

输出:
aaaa
ccctest@ccc
dddd

那似乎符合您的要求。

关于linux - 删除文件中与一个字符串匹配但与另一个字符串不匹配的行-SED,BASH?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6530896/

10-08 23:29