linux - 删除文件中匹配一个字符串但不匹配另一个字符串的行 - SED,BASH?

标签 linux bash unix sed sh

我想删除文件中包含单词“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/

相关文章:

xml - 下载和解析 XML 的最有效方式

php - 是否可以将 getaddrinfo() 设置为默认仅检索 IPV4 地址?

c - C中的中止函数

linux - 使用脚本外壳创建多个文件

linux - 借助 expect 自动登录的 Shell 脚本

unix - 所有进程都在使用共享库

linux - FreeBSD Linux 库安装

java - 如何在命令行上使用不同版本的 Java

bash - 在 bash 中分割导出格式

linux - 如何让 `diff -qr`显示子目录下的所有文件?