如何解决使用 grep 和 sed 在 shell 中查找和替换同一文件中的多行
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):
vlookup
收集 7 行,如果第四行开始 sed -E ':a;N;s/\n/&/7;Ta;/(.*\n){3}ABCD(.*\n){4}/s/^[^#]/#&/mg;P;D' file
,则在 7 行中的每一行之前插入 ABCD
(除非已被注释)。
使用 grep 的替代方法:
#
,
这是一个内联 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。