命令在交互式 shell 中工作,但不在脚本内工作

命令在交互式 shell 中工作,但不在脚本内工作

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

相关内容