我的文本文件中有以下文本块:
* 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 *
只打印输出像stdout
sed
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