![如何使用 sed 排除匹配并仅更改特定字符](https://linux22.com/image/1397797/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20sed%20%E6%8E%92%E9%99%A4%E5%8C%B9%E9%85%8D%E5%B9%B6%E4%BB%85%E6%9B%B4%E6%94%B9%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6.png)
我尝试使用sed
用单词 'correct' 替换 '0'(我使用echo $?
来验证我的脚本,并且我想替换 的输出echo
)。问题是我在输出文件中有更多文本,并且sed
正在替换所有内容而不仅仅是“0”。
例如:
some command
echo ``date` `>> "file"
echo $? >> "file"
sed -i 's/0/correct/g' /"file"
有什么想法可以让我让它工作吗?
编辑 1 2014.02.13
输出echo $?
为“0”(我知道 0 表示一切正常)。
接下来的事情是sed -i 's/0/correct/g' /"file"
(我只是使用了“”,因为有人可能会用特定的名称误解它)。
以下是脚本的一部分:
echo `date` | cat >> /file.txt
echo $? | cat >> /file.txt
sed -i 's/0/correct/g' /file.txt
-i
方法:
text Insert text, which has each embedded newline preceded by a back‐slash.
答案1
从您的代码片段中,sed
表达式看起来是正确的 - 它将用字符“正确”替换每个“0”字符。如果你仅有的echo
想要更新命令的输出,可以将sed
命令放在输出上echo
,例如:
一些命令 日期 >> /file.txt 回显 $? | sed 's/0/correct/' >> /file.txt
(请注意,删除“echo”和“cat”命令不会影响输出)
在您使用该选项的上下文中-i
,它实际上是一个命令行选项,而不是sed
脚本命令 - 它是页面中的不同部分man
:
-i[后缀], --in-place[=后缀] 就地编辑文件(如果提供了扩展,则进行备份)
这意味着它将更新源文件(这正是您在示例中想要的)。
但是,请注意,在此示例中,检查的退出代码是 的退出代码date
,而不是您的命令。事实上,在您的示例中,它正在检查 的退出代码echo
,我怀疑这对您更没有帮助。
执行此检查的更标准方法是这样的:
一些命令 结果=$? 日期 >> /file.txt 如果 [ $结果-eq 0 ] 然后 echo “命令成功完成”>> /file.txt 别的 echo "命令失败,退出代码为 $result" >> /file.txt 菲
答案2
如果您只想替换包含“0”而不包含其他内容的行,请使用:
sed -i 's/^0$/correct/g' file.txt
其中^
和$
分别是表示行开始和结束的特殊字符。
如果文件中还有其他行仅包含“0”,而不仅仅是$?
返回值,则可能存在一个潜在问题。改进此问题的一种方法是打印更多内容,而不仅仅是$?
:
echo RETVAL: $?
然后稍后匹配这个字符串:
sed -i 's/^RETVAL: 0$/correct/g' file.txt
答案3
如果您确实不需要搜索输出文件并对其进行更改,那么首先更改您写入的内容会更容易。
使用这段脚本,如果命令成功并返回退出代码"0"
, "correct"
则将写入您的文件:"/file.txt"
。如果命令返回任何其他退出代码,则该退出代码(数字)将写入您的文件。
some command
r=$?
[ $r -eq 0 ] && r="correct"
echo "`date` $r" >> /file.txt
注意:这将在同一行上输出日期和您的消息(“正确”),这可能是您想要的。如果您希望日期在一行上,而消息在另一行上,则将其更改为两个 echo 命令,例如:
some command
r=$?
[ $r -eq 0 ] && r="correct"
echo `date` >> /file.txt
echo $r >> /file.txt
您可能还想尝试实现(至少)另外两种可能性:
首先,如果你仅有的如果命令成功(返回退出代码),则写入文件"0"
。成功时,这将写入"correct"
文件,否则,如果返回任何其他退出代码,则没有什么将被写入您的文件:
some command
[ $? -eq 0 ] && echo "`date` correct" >> /file.txt
或者,如果您想识别所有退出代码,其中退出代码等于"0"
“正确”,并且任何其他退出代码等于“错误”,那么:
some command
r=$?
if [ $r -eq 0 ]; then
r="correct"
else
r="error: exit code $r"
fi
echo "`date` $r" >> /file.txt