sed在搜索字符串下方插入空白行,然后在下一行插入字符串

时间:2018-10-04 11:49:05

标签: bash sed

我在传递参数的函数中有一个sed表达式。

const range = ([min, max]) => {
  let arr = [];
  for (var i = min; i <= max; i++) arr.push(i);
  return arr;
};
const gcd = (a, b) =>  !b ? a : gcd(b, a % b);
const lcm = (a, b) => (a * b) / gcd(a, b);

const smallestCommons = (arr) => range(arr).reduce((acc, cur) => acc = lcm(acc, cur), arr[0]);

console.log(smallestCommons([1, 3])); // 6
console.log(smallestCommons([1, 6])); // 60

我正在尝试在搜索字符串下方插入空白行,并在其后插入插入字符串。

如此

insert_after_new_line() {
    if ! grep -q "${2}" "${3}"; then
        sed -i "/${1}/{N;N;a ${2}}" "${3}"
    fi
}

insert_after_new_line search insert textfile.txt

成为

text
text
search
text

但我不断收到错误消息

  

sed:-e表达式#1,字符0:不匹配的`{'

3 个答案:

答案 0 :(得分:3)

我对此进行了测试。在命令行中工作

sed -i  '/search/a \\ninsert' file

答案 1 :(得分:1)

sed确实用换行符分隔命令。有一个;,但是它不适用于所有命令,大多数命令都以文件名作为参数。 ;不适用于r R或例如a。 sed将在a命令之后读取所有内容,因此sed解释就像a ${2}}作为单个命令一样,结果它找不到包围}的内容,因为它被a吞噬了命令。您需要换行符:

sed -i "/${1}/{N;N;a ${2}
}" "${3}"

sed -i "/${1}/{N;N;a ${2}"$'\n'"}" "${3}"

答案 2 :(得分:1)

这应该有效:

sed -i '/search/{G;ainsert 
}' file

您可以使用shell变量替换文本,但也可以将双引号替换为单引号。