【问题标题】:Replacing text with special character in linux shell script?在linux shell脚本中用特殊字符替换文本?
【发布时间】:2021-03-06 16:41:38
【问题描述】:

我目前正在做一个项目,将大量 C 程序移植到一个新的 Linux 系统上。我的目标是尽可能自动化大部分简单的重复错误。

现在我正在处理许多无效的 NULL 分配,在特定的行上应该是 '\0'。示例:

attribute = NULL;

应该是

attribute = '\0';

我有一个发生此错误的所有行的列表。所以现在我需要做的就是创建一个将 NULL 更改为 \0 的脚本。这是我尝试过的代码行,有不同的变化:

sed -i "${1}s/NULL/\\0/" ${2}

${1} 是发生错误的行,${2} 是文件名。

编辑:

不是用 \0 替换 NULL,而是将其替换为 'NULL'。我需要一个命令,将 NULL 替换为字符 \ 和 0,而不是特殊字符。

【问题讨论】:

  • 您是在问如何获取替换字符串中的单引号?不清楚你想要什么。
  • 您的帖子中似乎没有问题或问题描述。假设您的命令没有按预期工作,请展示您如何调用它、您获得的实际结果/输出以及您期望获得的结果。请edit您的问题添加此信息。
  • @Bodo 我很抱歉。我用更多信息编辑了帖子,这是我的错。如果您需要更多说明,请告诉我
  • 我真的希望你有版本控制,这样你就可以检查你的替换脚本不会失控并破坏一切。 git reset --hard 是退出 sed 脚本出错的好方法。
  • @tadman 非常正确,我只是假设我的 sed 命令格式可以轻松修复。我将开始研究其他选择。谢谢!

标签: c linux shell unix sed


【解决方案1】:
$ cat file
attribute = NULL;

$ sed 's/NULL/'\''\\0'\''/' file
attribute = '\0';

您可能想要添加单词边界,这样您就不会用NULL 替换其中的字符串。您必须使用 GNU sed 来使用 -i 所以:

$ cat file
attribute = NULL;
FOONULLBAR

$ sed 's/NULL/'\''\\0'\''/' file
attribute = '\0';
FOO'\0'BAR

$ sed 's/\<NULL\>/'\''\\0'\''/' file
attribute = '\0';
FOONULLBAR

您可能还需要考虑在公共标头中定义变量 NUL = '\0' 并使用它来代替 NULL,而不是在任何地方硬编码 \0

仅对存储在变量中的特定行号进行替换:

$ lineNr=1; sed "$lineNr"'s/NULL/'\''\\0'\''/' file
attribute = '\0';
FOONULLBAR

$ lineNr=2; sed "$lineNr"'s/NULL/'\''\\0'\''/' file
attribute = NULL;
FOO'\0'BAR

或者如果您不介意在反斜杠上加倍,并且知道您的 sed 命令中没有任何其他内容可以让 shell 解释/扩展(对于这种特定情况也是如此):

$ lineNr=1; sed "${lineNr}s/NULL/'\\\\0'/" file
attribute = '\0';
FOONULLBAR

$ lineNr=2; sed "${lineNr}s/NULL/'\\\\0'/" file
attribute = NULL;
FOO'\0'BAR

【讨论】:

  • 将新变量定义为 '\0' 听起来是个好主意。实际上我可能最终会这样做。
  • 您列出的命令按原样工作得很好。唯一的问题是我只想在特定行(在我的示例中为 ${1})用 '\0' 替换 NULL。但最后用你的建议来解决可能很容易。谢谢!
  • 我更新了我的答案以显示如何定位特定的行号。希望很明显,我建议将 NUL 作为变量名,因为这就是 Ascii 中的 \0 - NUL 字符(不要与 C 中的 NULL 指针混淆)。
  • 效果很好,非常感谢您的快速响应!
猜你喜欢
  • 2013-12-23
  • 2013-11-18
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多