我有一个 .txt 文件,其中包含如下文本:
{remove}Some text in line 1
Some text in line 2
Some text in line 3
{remove} Some text in line 4
使用参数扩展如何删除包含特殊标签 {remove} 的所有行?
我试过这个,但它不起作用!
text="$(cat "template.txt")"
echo "${text##\{remove\}*'\n'}"
谢谢
我有一个 .txt 文件,其中包含如下文本:
{remove}Some text in line 1
Some text in line 2
Some text in line 3
{remove} Some text in line 4
使用参数扩展如何删除包含特殊标签 {remove} 的所有行?
我试过这个,但它不起作用!
text="$(cat "template.txt")"
echo "${text##\{remove\}*'\n'}"
谢谢
你可以这样做。只需逐行读取字符串并检查它是否包含子字符串:
string="{remove}Some text in line 1
Some text in line 2
Some text in line 3
{remove} Some text in line 4"
while read -r line; do
if [[ $line != *"{remove}"* ]]; then
printf '%s\n' "$line"
fi
done <<< "$string"
还有其他方法,正如@Alfe 评论的那样。
这有点棘手,因为你无法阻止 shell-pattern*
变得贪婪。
您可以做的是使用 extglob 仅匹配换行符以外的字符:
shopt -s extglob
text=$(<template.txt)
echo "${text//'{remove}'*([!$'\n'])/}"
这将留下空行;如果你想完全删除这些行,那么你需要确保字符串本身包含一个尾随换行符(否则最后一行将永远不会匹配模式):
shopt -s extglob
text=$(<template.txt)$'\n'
printf %s "${text//'{remove}'*([!$'\n'])$'\n'/}"
...使用printf
而不是echo
上面来避免将尾随换行符加倍。