shell 中的多行替换

shell 中的多行替换

我的文本文件中有以下文本块:

* Exported from Foo *

Title and Section

和另一个

* Exported from Foo *

Other Title and Other Section

我需要将其替换为

# Title and Section

# Other Title and Other Section

现在,我可以这样做:

echo "$(grep -A 2 "Exported from Foo" ../tmp/data/${nospacefile} | grep -v "Exported from Foo" | grep -v -- -- | tr -d '\r' | grep -v -e '^[[:space:]]*$' | sed -e 's/^[ \t]*//')" | while read -r title; do sed -i -e "s/^\([[:blank:]]*\)$title/\# $title/g" ../tmp/data/${nospacefile}; done

但是,字符串“标题和部分”或“其他标题和其他部分”也出现在我不想替换的地方。我只希望它出现在导出行和空行之后时被替换。

对我来说,执行此操作的最佳 shell 结构是什么?我非常乐意将标准输出发送到 perl、python 等。

答案1

您可以尝试,无论第二行是否为空,都ed(1)从第三行开始编辑。* Exported from Foo *

只打印输出像stdoutsed

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' ,p Q | ed -s file.txt 

这只是将输出打印到stdout,以就地编辑文件。

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' w | ed -s file.txt 

使用ed仅将输出打印到的脚本stdout

cat script.ed

输出

g/^\* Exported from Foo \*$/+2s/^/# /
,p
Q

编辑文件的脚本in-place

g/^\* Exported from Foo \*$/+2s/^/# /
w
q

现在你可以做

ed -s file.txt < script.ed

相关内容