bash-参数替换直到换行

bash-参数替换直到换行,bash,variable-expansion,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'}" 谢谢你你可以这样做。只需逐行读取字符串并检查它是否包含子字符

我有一个.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"
string=“{remove}第1行中的一些文本
第2行中的一些文本
第3行中的一些文本
{删除}第4行中的某些文本“
而read-r行;做
如果[[$line!=*“{remove}”*];然后
printf'%s\n'$行
fi

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

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"
string=“{remove}第1行中的一些文本
第2行中的一些文本
第3行中的一些文本
{删除}第4行中的某些文本“
而read-r行;做
如果[[$line!=*“{remove}”*];然后
printf'%s\n'$行
fi

完成这有点棘手,因为您无法阻止shell模式
*
s变得贪婪

您可以使用extglob只匹配除换行符以外的字符:

shopt -s extglob
text=$(<template.txt)
echo "${text//'{remove}'*([!$'\n'])/}"
shopt-s extglob

text=$(这有点棘手,因为您无法阻止shell模式
*
s变得贪婪

您可以使用extglob只匹配除换行符以外的字符:

shopt -s extglob
text=$(<template.txt)
echo "${text//'{remove}'*([!$'\n'])/}"
shopt-s extglob

text=$(您是否启用了extglobs?您介意启用它们吗?要删除行,请使用
grep
text=$(grep-v'^{remove}'template.txt)
@Alfe,显然这是可能的。我读到的问题是,这是否可以通过参数扩展来完成。这就是一个有趣的问题。:)(顺便说一句——我倾向于建议将此技术限制在较小的文件中;参数扩展并不总是像使用大缓冲区时那样有效,甚至会压倒启动具有足够大内容的grep或sed等工具的fork/exec开销)…无论如何,对于这样一个次优的过滤问题,得到一个人想要的答案是适当的奖励。:)您是否启用了extglobs?您介意启用它们吗?要删除行,请使用
grep
text=$(grep-v'^{remove}template.txt)
@Alfe,显然这是可能的。我读到的问题是,这是否可以通过参数扩展来实现。这就是为什么这是一个有趣的问题。:)(顺便说一句——我倾向于建议将此技术限制在较小的文件中;参数扩展并不总是像使用大缓冲区时那样有效,甚至会压倒启动具有足够大内容的grep或sed等工具的fork/exec开销)…无论如何,对于这样一个次优的过滤问题,得到一个人要求的答案是适当的奖励。:)不错+1,但这确实会删除内容,但仍然会打印空行。@CharlesDuffy true,我很快就把这条评论贴到了:)一种粗俗的方式来选择后面的换行:
echo“$(echo”${text/'{remove}*([!$'\n'])?($'\n'/}”)“
--不需要先手动将换行符固定到字符串的末尾。谢谢!它起作用了:-D Ps:我喜欢你的方法nice+1,但这确实会删除内容,但仍然会打印空行。@CharlesDuffy true,我很快将该注释发布到:)一个粗略的方式来选择后面的换行符:
echo“$(echo”${text/'{remove}'*([!$'\n'])?($'\n'/}”)“
--不需要先手动将换行符固定到字符串的末尾。谢谢!它起作用了:-D Ps:我喜欢你的方法
printf'%s\n'$line”
,或者至少
echo“$line”将是改进。为了显示“代码> Prtff < /Cube >但<代码>回声< /代码>的情况,不要考虑一个只有“代码> -n>代码>的行。而<代码> ECHAL $行/代码>没有引号将非常非常错误地使用一行代码< */C> >。@ CharlesDuffy,您绝对正确,我已经编辑了帖子。<代码>打印。f“%s\n”的$line“
,或至少
回显“$line”<代码> >将是改进。为了显示“代码> Prtff < /C> >但<代码>回声< /代码>不考虑,只考虑“代码> -N<代码>的行。而<代码>回声$行<代码>没有引号,将非常非常错误地使用“代码> */Cuth>行。”CharlesDuffy,您完全正确,我已经编辑了该帖子。