crn.txt
我有一个名为包含以下文本的文本文件:
9 1 * * 3,6 /opt/testtingtools/kos/bin/cos.sh
55 23 * * * /opt/testtingtools/tqdaily.sh 2>>/opt/toolcheck/extract.err
50 11 * * 6 /opt/devtools/toolbox/toolcheck.sh >>toolcheck.log 2>&1
55 23 * * 5 /opt/devtools/toolbox/reset.sh >>/opt/toolcheck/log/reset.log
56 23 * * 6 /opt/prdtools/tqweekly.sh 2>>/opt/checktool/extract.err
30 11 * * 6 /opt/proadtools/tool.sh >/opt/checkingtools/tool.log 2>&1
我需要删除包含单词的行testtingtools
并更新crn.txt
,以便输出如下所示:
50 11 * * 6 /opt/devtools/toolbox/toolcheck.sh >>toolcheck.log 2>&1
55 23 * * 5 /opt/devtools/toolbox/reset.sh >>/opt/toolcheck/log/reset.log
56 23 * * 6 /opt/prdtools/tqweekly.sh 2>>/opt/checktool/extract.err
30 11 * * 6 /opt/proadtools/tool.sh >/opt/checkingtools/tool.log 2>&1
我正在使用命令
sed '/testtingtools/d' crn.txt 2>&1 | tee crn.txt
它可以在 bash 或命令行中运行,但不能在脚本内运行。我正在使用unix服务器(sunSolaris)。
还有一个命令可以在 linux 下运行,但不能在 unix 下运行:
echo "$(sed '/testtingtools/d' crn.txt)" > crn.txt
“不工作”意味着它不会删除特定行,当我使用脚本内的代码时,它会清空整个文件。但是当我在命令行中使用代码时,它会从crn.txt
.
答案1
Solarissed
无法进行就地编辑。
在 Linux 上,您可能会使用
sed -i '/testtingtools/d' crn.txt
可以在 Solaris 和 Linux 上运行的可移植方法是
cp crn.txt crn.tmp
sed '/testtingtools/d' <crn.tmp >crn.txt &&
rm crn.tmp
您可能会遇到的情况是,在有机会读取tee
文件之前截断文件,从而导致文件为空。sed
管道中的命令是同时运行的。
一般来说,您希望避免读取在同一命令中截断的文件,而是使用临时文件。这就是sed -i
幕后所做的事情。
与您的其他命令类似:
echo "$(sed '/testtingtools/d' crn.txt)" > crn.txt
最好写成
sed '/testtingtools/d' crn.txt >crn.txt
这第一的在任何标准 shell(在 Linux 和 Solaris 上)中都会发生的事情是 shell 看到重定向并将输出文件截断为零大小。 然后它执行sed
.此命令在 Linux 和 Solaris 上都无法按预期工作(也就是说,如果您希望它编辑原始文件)。
答案2
We can do it both sed and awk
awk方法
awk '!/testtingtools/{print $0}' crn.txt >l.txt &&yes| mv l.txt crn.txt
输出
cat crn.txt
50 11 * * 6 /opt/devtools/toolbox/toolcheck.sh >>toolcheck.log 2>&1
55 23 * * 5 /opt/devtools/toolbox/reset.sh >>/opt/toolcheck/log/reset.log
56 23 * * 6 /opt/prdtools/tqweekly.sh 2>>/opt/checktool/extract.err
30 11 * * 6 /opt/proadtools/tool.sh >/opt/checkingtools/tool.log 2>&1