0

我有一个 .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'}"

谢谢

4

2 回答 2

2

你可以这样做。只需逐行读取字符串并检查它是否包含子字符串:

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 评论的那样。

于 2015-04-14T20:53:40.917 回答
2

这有点棘手,因为你无法阻止 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上面来避免将尾随换行符加倍。

于 2015-04-14T20:53:53.767 回答