我有一个包含如下文本的.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'}"
谢谢
答案 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
来避免将该跟踪换行加倍。