如何将sed命令拆分为多行

文森特·范高

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

ghoti

嗯...您可以使用较短的变量名吗?延长脚本的时间实际上并不是它的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依赖性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章