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
以避免将尾随换行符加倍。
我有一个 .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
以避免将尾随换行符加倍。