如何将sed命令拆分为多行

时间:2016-02-09 22:54:44

标签: sed sh

我有多个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拆分为多行。感谢。

2 个答案:

答案 0 :(得分:2)

呃......你能用更短的变量名吗?您的脚本中的 sed 部分确实不会让它变长。

那就是说,你可以稍微优化一下。不知道输入文件的其余部分是什么样的,我无法确定,但其中一个或部分可能适合您。

在我们开始之前,一句警告。如果变量包含将由sed解释或翻译的任何字符,这些sed选项(以及你问题中的那个)都将失败。这意味着字符串不能包含斜杠(/),也不能包含可转换为正则表达式引用的字符串(\1等)。要在bash中解决此问题,您可以使用以下命令从字符串中删除所有非字母数字字符:

kSchemeScheduleQueue="${kSchemeScheduleQueue//[^[:alnum:]]/}"

首先,使用双引号以避免线上的额外单引号。使用此选项,我们还假设字符串=没有出现在您感兴趣的变量之前的其他位置。

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

接下来,如果您确实希望使用实际换行符拆分行,则需要将事物拆分为多个语句,每个语句都在一行中。如果搜索成功,我们在花括号中运行您的替换。这是有效的,因为忽略s ubstitute命令之前的空格。它实际上不是更短,但线条更短。

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依赖。

答案 1 :(得分:1)

这可能适合你(GNU sed):

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

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