bash - 参数替换直到换行

时间:2015-04-14 20:45:05

标签: bash variable-expansion

我有一个包含如下文本的.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'}"

谢谢

2 个答案:

答案 0 :(得分: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评论的那样。

答案 1 :(得分:2)

这有点棘手,因为你不能阻止shell模式*变得贪婪。

您可以使用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来避免将该跟踪换行加倍。