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