我需要使用 Linux 命令更改 crontab 上的一行。我无法使用 sed 命令找到解决方案。你可以帮助我?原来的行是:
* * * * * root /foo/pluto/minnie.sh
并且必须成为
#* * * * * root /foo/pluto/minnie.sh
万分感谢
理查德
答案1
关于什么:
crontab -l |sed 's/\(.*minnie\)/#\1/' > tmpfile
crontab tmpfile
rm tmpfile
或者
EDITOR=/usr/bin/ed crontab -e
1
/minnie
s/^/#/
w
q
答案2
perl -pi -le '$_ = "#$@" if $_ eq "* * * * * root /foo/pluto/minnie.sh"' your-file
是精确匹配该行内容的一种选项。
您还可以将该行存储在变量中:
line='* * * * * root /foo/pluto/minnie.sh'
然后将其用作:
file=some-file
perl -pi -lse '$_ = "#$_" if $_ -eq $line' -- -line="$line" -- "$file"
或者作为环境变量传递:
export LINE='* * * * * root /foo/pluto/minnie.sh'
perl -pi -le '$_ = "#$_" if $_ -eq $ENV{LINE}' -- "$file"
要将其与以下内容集成crontab -e
:
LINE='* * * * * root /foo/pluto/minnie.sh' \
VISUAL='perl -pi -le '\''$_ = "#$_" if $_ -eq $ENV{LINE}
'\'' --' crontab -e
或者:
LINE='* * * * * root /foo/pluto/minnie.sh' \
CODE='$_ = "#$_" if $_ -eq $ENV{LINE}' \
VISUAL='perl -pi -le "$CODE" --' crontab -e
然后将使用空格的内容和临时文件的名称作为其解释的代码来crontab
运行,并且两者都会在其环境中找到它们需要的变量(for ,for )。sh
$VISUAL
sh
perl
CODE
sh
LINE
perl
显然这不是一个视觉的我们在这里使用的编辑器但$VISUAL
优先级高于,因此如果我们使用,$EDITOR
我们必须取消设置$VISUAL
$EDITOR
答案3
我无法使用 sed 命令找到解决方案
这非常简单:要寻址一组行,您可以指定一条规则。规则由用于选择行的正则表达式和要在这些行上运行的一组命令组成。这是一个例子:
sed '/^abc/ {; s/abc/xyz/g; }' /path/to/input > output
这只适用于以“abc”开头的行。在所有这些行中(仅在这些行中),任何字符串“abc”都会更改为“xyz”。
因此,如果您想注释行,请将行的开头替换为 octothorpe:
sed '/minnie/ {; s/^/# / ; }' /path/to/input > output
如果您想在注释掉的行之后添加新行,也可以使用“a”命令:
sed '/minnie/ {
s/^/# /
a\
this gets inserted after the commented line
}' /path/to/input > output
最后: sed 将其输出写入stdout
默认值。您无法立即将其通过管道传输回原始文件,因为这会损坏它。另外,请远离诸如“-i”开关之类的令人厌恶的东西,即 GNU-sed,因为它是非 POSIX 的,并且会使您的脚本不太可移植。这样做更安全、更好:
if sed '<your sed-script>' input > output ; then
mv output input
else
print -u2 - "sed malfunction, check output"
exit 1
fi