使用带有Sed的其他分隔符删除

使用带有Sed的其他分隔符删除,sed,Sed,相当肯定我错过了一些明显的东西 $ cat test.txt 00 30 * * * /opt/timebomb.sh >> timebomb.log 01 30 * * * /opt/reincarnate.sh >> reincarnation.log $ sed ':timebomb:d' test.txt 00 30 * * * /opt/timebomb.sh >> timebomb.log 01 30 * * * /opt/rein

相当肯定我错过了一些明显的东西

$ cat test.txt
  00 30 * * * /opt/timebomb.sh >> timebomb.log
  01 30 * * * /opt/reincarnate.sh >> reincarnation.log
$ sed ':timebomb:d' test.txt
  00 30 * * * /opt/timebomb.sh >> timebomb.log
  01 30 * * * /opt/reincarnate.sh >> reincarnation.log
鉴于

$ sed '/timebomb/d' test.txt
  01 30 * * * /opt/reincarnate.sh >> reincarnation.log

为什么会这样?
d
命令不支持一组不同的分隔符吗?

您使用的分隔符
/
不用于
d
命令,而是用于寻址。我认为您正在将它们与
s//
命令中的斜杠进行比较。。。然而,尽管两者都与正则表达式有关,但它们是不同的上下文

地址(显示在命令之前)过滤命令应用到的行。。。选项(出现在命令之后)用于控制应用的替换

如果要对地址中的正则表达式使用不同的分隔符,则需要以反斜杠开始地址:

$ sed '\:timebomb:d' test.txt
  01 30 * * * /opt/reincarnate.sh >> reincarnation.log

(为了理解地址和选项之间的差异,请考虑命令的输出:

$ sed '/timebomb/s/log/txt/' test.txt

地址只选择包含正则表达式的行,但是选项告诉
s
命令将正则表达式
log
替换为
txt

冒号在sed中前面有一个标签,因此sed程序看起来像是一对没有发生任何事情的标签。如果前面有s命令,解析器可以将冒号视为分隔符,因此这是一种特殊情况。

使用gawk

gawk '!/timebomb/' file > newfile

您只需使用外壳,无需外部工具

while read -r line
do 
    case "$line" in
        *timebomb* ) continue;;
        *) echo "$line";;
    esac        
done <"file"
读取时-r行
做
大写“$line”
*定时炸弹*)继续;;
*)回音“$line”;;
以撒

非常感谢您提到以反斜杠开头的选项,完成了可能的重复!