bash - 参数替换直到换行

bash - parameter substitution until line break

我有一个 .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 *s 变得贪婪。

你可以做的是使用 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 以避免将尾随换行符加倍。