我想删除文件中包含单词“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
字符串
正如你所看到的,我是一个新手:(
4条答案
按热度按时间o0lyfsai1#
字符串
第一个模式匹配包含'test'的行;第二种模式删除行,除非它们匹配“test @”。
在数据文件上测试:
型
输出量:
型
这似乎符合你的要求。
你介意解释一下
sed
是如何构造和使用这个正则表达式的吗?在
sed
脚本的那一行中有两个正则表达式:/test/
-查找包含test
的行。/test@/
-查找包含test@
的行。/test/{…}
表示法的意思是“当行匹配test
时,在…
中执行该操作。/test@/!d
的意思是“当行不匹配test@
时,删除它”。macOS上的
sed
需要分号(可能还有其他基于BSD的Unix版本);它可以在GNUsed
中省略,但由于它可以在两种情况下工作(我经常在macOS上测试),因此保留它似乎是明智的。它标志着!d
命令的结束。6jygbczu2#
使用
grep
:字符串
通常
grep
打印匹配的行,但-v
告诉它打印不匹配的行。正则表达式匹配任何出现的“test”,它后面跟着除了“@”之外的任何东西。如果您不需要在一行的末尾出现“test”,这是很好的。如果是这种情况,请使用
型
我认为不值得去探究为什么你的解决方案不起作用,因为它在很多方面都是坏的。
tcbh2hod3#
如果你把你的问题转过来一点,它就变成了:
如何从包含字符串'test@'或不包含字符串'test'的文件中筛选出所有行。
例如,可以在awk中这样做:
字符串
乔纳森的回答也是,我只是想给予你一个替代版本。
5fjcxozz4#
如果使用
ed
,则不需要tmp文件!字符串