如何将sed命令拆分为多行

如何将sed命令拆分为多行,sed,sh,Sed,Sh,我有多个sed命令行,有点长。其中一项是: sed -i 's/kSchemeScheduleQueue = .*/kSchemeScheduleQueue = '$kSchemeScheduleQueue';/' config.cc 我试图在中加入 \/> >中间。 sed -i 's/kSchemeScheduleQueue = .*/\ kSchemeScheduleQueue = '$kSchemeScheduleQueue';/' config.cc 但这会在我

我有多个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将解释或翻译这些字符。这意味着字符串不能包含斜杠(
/
),也不能包含将转换为正则表达式引用的字符串(
\1
等)。例如,要在bash中解决此问题,可以使用以下方法从字符串中删除所有非字母数字字符:

kSchemeScheduleQueue="${kSchemeScheduleQueue//[^[:alnum:]]/}"
首先,使用双引号避免在行中使用额外的单引号。使用此选项,我们还假设字符串
=
不会出现在您感兴趣的变量之前

sed -i "/kSchemeScheduleQueue = /s/= .*/= $kSchemeScheduleQueue;/" config.cc
接下来,如果您确实希望使用实际的换行符拆分行,则需要将内容拆分为多个语句,每个语句都在一行上。在这里,如果搜索成功,我们将用大括号运行替换。这是因为
s
substitute命令之前的空白被忽略。实际上它并不短,但线条更短

sed -i '/kSchemeScheduleQueue = .*/{;
  s/ = .*/ = '"$kSchemeScheduleQueue"';/;}' config.cc
我将提供的第三种选择不是使用sed,而是使用awk。这并不比您原来的sed脚本短很多,但是长度显然是由您的变量名引起的。另外,下面的代码并没有就地编辑文件,因此您需要在其周围包装一些脚本来处理该部分

awk -v s="$kSchemeScheduleQueue" '$1=="kSchemeScheduleQueue"{$3=s} 1' config.cc
您也可以单独在shell中执行此操作(如果该shell是bash/ksh/zsh/fish,则更容易),但这将导致命令更长而不是更短,尽管它将消除sed依赖关系。

这可能适用于您(GNU-sed):


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

对于引用,
-r
选项是GNU-sed ism。BSD sed的等效选项是
-E
,尽管FreeBSD的最新版本将
-r
作为等效选项。OSX仍然使用
-E
来表示ERE。如果您提供特定于平台的答案,最好包含您的解决方案所针对的平台。@ghoti我总是提供特定于平台的答案。
sed -ri 's/(kSchemeScheduleQueue = ).*/\1'"$kSchemeScheduleQueue"';/' config.c