使用带有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”;;
以撒
非常感谢您提到以反斜杠开头的选项,完成了可能的重复!