我有多个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拆分为多行。感谢。
答案 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
这通过使用反向引用来缩短命令。