sed - 如何将 sed 命令拆分为多行

标签 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 分成多行。谢谢。

最佳答案

呃...你可以使用更短的变量名吗?脚本中的 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/

相关文章:

perl - 文件中恰好需要 1 个尾随换行符

awk - 将字符串替换为 sed 或 awk,其中它标识一个模式,如下所述

android - 我的 shell 脚本没有在 android 上运行

linux - 可以将 10 个相似的函数变成一个 for 循环吗?

xml - Bash 脚本使用 XMLStarlet 将 xml 元素解析为 key=value 对

mongodb - 如何通过shell脚本执行mongo命令?

linux - 需要删除文件每三行的最后一列

python - 将空格分隔的元素拆分为单独的行

regex - SED中的表达式 '^$'是怎么来的?

字符串以 "-e"开头的 Shell 脚本