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