在shell中使用grep和sed查找和替换同一文件中的多行



grep -A 4 -B 3 "ABCD" file.txt | sed -i.bak 's/^/#/g'

我使用上面的代码插入第一行搜索模式与#。我需要在一个搜索模式的基础上替换多行。这些内容必须在同一文件中被替换(替换),或者新文件也应该包含原始内容。

下面是输入文件的预期输出示例:

假设file.txt的内容是-

PQRS
1
2
3
4
ABCD
1
2
3
4
WXYZ
1
2
3
4
ABCD
1
2
3
4

预期输出为-

PQRS
1
#2
#3
#4
#ABCD
#1
#2
#3
#4
WXYZ
1
#2
#3
#4
#ABCD
#1
#2
#3
#4

有什么想法吗?有没有一种微妙的方法来做到这一点,而不是循环和移动文件指针使用perl或任何其他脚本。

这可能适合您(GNU sed):

sed -E ':a;N;s/n/&/7;Ta;/(.*n){3}ABCD(.*n){4}/s/^[^#]/#&/mg;P;D' file

收集7行,如果第四行以ABCD开头,在每7行之前插入#(除非它已经被注释过)。

使用grep:

grep -n -A4 -B3 'ABCD' file | 
sed -nE 's/^([0-9]+).*/1s@^[^#]@#&@/p' | sed -f - file

这是一个内联sed方法:

#!/usr/bin/env bash
pattern=${1:-ABCD}
input=${2:-file.txt}
sed "
/^[[:upper:]]*$/ {
    /$pattern/ {  # if target pattern, append the next line and comment both
        N
        s/^/#/
        s/n/n#/
    }
}
/^[[:digit:]]*$/ {  # if digit(s), comment out if it's not a 1
    /^1$/! {
        s/^/#/
    }
}
" $input

相关内容

  • 没有找到相关文章

最新更新