如何将 sed 命令拆分为多行

How to split a sed command into multiple lines

我有多个 sed 命令行,它们有点长。其中之一如下:

sed -i 's/kSchemeScheduleQueue = .*/kSchemeScheduleQueue = '$kSchemeScheduleQueue';/' config.cc

我试图通过在中间添加 \ 来拆分它,例如

sed -i 's/kSchemeScheduleQueue = .*/\
          kSchemeScheduleQueue = '$kSchemeScheduleQueue';/' config.cc

但这会在我的文件中添加一个新行和多个空格。我从其他地方看到反斜杠在单引号中似乎效果不佳。
我还尝试了双引号,下面的内容可以工作,没有额外的空格或换行,但是缩进不好,因为我的 sed 命令在嵌套的 for 循环中,而下面的第二行必须是非缩进的。

sed -i "s/kSchemeScheduleQueue = .*/\
kSchemeScheduleQueue = $kSchemeScheduleQueue;/" config.cc

我只是想知道是否有一种简单的好方法可以针对我的情况将 sed 分成多行。谢谢。

呃...你能用一个更短的变量名吗?真正使脚本变长的并不是 sed 部分。

也就是说,您或许可以稍微优化一下。在不知道您的输入文件的其余部分是什么样子的情况下,我无法确定,但其中一个或一些可能对您有用。

在我们开始之前,一句警告。如果变量包含将由 sed 解释或翻译的任何字符,这些 sed 选项(以及您问题中的选项)都将失败。这意味着字符串不能包含斜杠 (/),也不能包含会变成正则表达式引用的字符串 (</code> 等)。要解决此问题,例如 bash,您可以使用以下命令从字符串中删除所有非字母数字字符:</p> <pre><code>kSchemeScheduleQueue="${kSchemeScheduleQueue//[^[:alnum:]]/}"

首先,使用双引号,避免在一行中出现多余的单引号。使用此选项,我们还假设字符串 = 不会出现在您感兴趣的变量之前的其他地方。

sed -i "/kSchemeScheduleQueue = /s/= .*/= $kSchemeScheduleQueue;/" config.cc

接下来,如果您确实想用实际的换行符拆分行,则需要将内容拆分为多个语句,每个语句占一行。在这里,如果搜索成功,我们 运行 你用大括号替换。这是有效的,因为忽略 substitute 命令之前的空格。它实际上并没有更短,但行更短了。

sed -i '/kSchemeScheduleQueue = .*/{;
  s/ = .*/ = '"$kSchemeScheduleQueue"';/;}' config.cc

我提供的第三个选项是不使用 sed,而是使用 awk。这并不比您原来的 sed 脚本短很多,但长度显然是由您的变量名引起的。此外,以下内容不会就地编辑文件,因此您需要围绕它包装一些脚本来处理该部分。

awk -v s="$kSchemeScheduleQueue" '=="kSchemeScheduleQueue"{=s} 1' config.cc

您也可以单独在 shell 中执行此操作(如果 shell 是 bash/ksh/zsh/fish 则更容易),但这会导致命令更长而不是更短,尽管它会消除 sed 依赖。

这可能对你有用 (GNU sed):

sed -ri 's/(kSchemeScheduleQueue = ).*/'"$kSchemeScheduleQueue"';/' config.c

这通过使用反向引用缩短了命令。