我有多个 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
接下来,如果您确实想用实际的换行符分割行,则需要将内容分割成多个语句,每个语句都在一行上。在这里,如果搜索成功,我们将在大括号中运行您的替换。这是有效的,因为 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 依赖性。
关于sed - 如何将 sed 命令拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35303807/