如何使用 sed 排除匹配并仅更改特定字符

如何使用 sed 排除匹配并仅更改特定字符

我尝试使用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

相关内容