このモデルでは
[string 1]{string 2}
string 2
間の文字列を抽出したいです。最後ペアマッチ中かっこ - つまり、削除、開く[string 1]
、{
閉じる}
。または、追加の[
ペアがある場合、]
以下の試みは失敗します。string 1
string 2
希望の出力:
以下のスクリプトの目的の出力は、次から始めてfoo
終了しますdigit
。
foo bar 1
foo bar 2
foo[3]{xyz} bar 3
foo $sq[3]{xyz}$ bar 4
foo $sq[3]{xyz}$ bar 5
foo $sq[3]{xyz}$ bar 6
foo $sq[3]{xyz}$ bar 7
foo $sq[3]{xyz}$ bar 8'
foo $sq[abc]{xyz}$ bar 9'
foo $sq[abc]{xyz}$ bar 10'
仮定:
- パラメータは次のとおりです。
RemoveInitialSquareBraces
いつもで始まり、[
で終わります}
。 - 開幕式
[
銀string 1
〜するの]
先頭に一致があります。{
string 2
プラットフォーム:
- アップルシステム 10.9.5
スクリプト
#!/bin/bash
function RemoveInitialSquareBraces {
#EXTRACTED_TEXT="$(\
# echo "$1" \
# | sed 's/^\[.*\]//' \
# | sed 's/{//' \
# | sed 's/}$//' \
# )"
EXTRACTED_TEXT="$(\
echo "$1" \
| sed 's/.*[^0-9]\]{\(.*\)}/\1/' \
)"
echo "${EXTRACTED_TEXT}"
}
RemoveInitialSquareBraces '[]{foo bar 1}'
RemoveInitialSquareBraces '[abc]{foo bar 2}'
RemoveInitialSquareBraces '[]{foo[3]{xyz} bar 3}'
RemoveInitialSquareBraces '[]{foo $sq[3]{xyz}$ bar 4}'
RemoveInitialSquareBraces '[goo{w}]{foo $sq[3]{xyz}$ bar 5}'
RemoveInitialSquareBraces '[goo[3]{w}]{foo $sq[3]{xyz}$ bar 6}'
RemoveInitialSquareBraces '[goo[3]{w} hoo[3]{5}]{foo $sq[3]{xyz}$ bar 7}'
RemoveInitialSquareBraces '[goo[3]{w} hoo[3]{5}]{foo $sq[3]{xyz}$ bar 8}'
RemoveInitialSquareBraces '[goo[3]{w} hoo[xyz]{5}]{foo $sq[abc]{xyz}$ bar 9}'
RemoveInitialSquareBraces '[goo[3]{w} hoo[xyz]{uvw}]{foo $sq[abc]{xyz}$ bar 10}'
exit 0
答え1
上記の入力例の場合、スクリプトは次のようになります。
sed s/[^\"\']*[^0-9]\]{\(.*\)}/\1/ <<\END
"[]{foo bar 1}"
"[abc]{foo bar 2}"
"[]{foo[3]{xyz} bar 3}"
"[]{foo $sq[3]{xyz}$ bar 4}"
"[goo{w}]{foo $sq[3]{xyz}$ bar 5}"
"[goo[3]{w}]{foo $sq[3]{xyz}$ bar 6}"
"[goo[3]{w} hoo[3]{5}]{foo $sq[3]{xyz}$ bar 7}"
END
生産する
"foo bar 1"
"foo bar 2"
"foo[3]{xyz} bar 3"
"foo $sq[3]{xyz}$ bar 4"
"foo $sq[3]{xyz}$ bar 5"
"foo $sq[3]{xyz}$ bar 6"
"foo $sq[3]{xyz}$ bar 7"
もう一つのことは、機能を単純化できることです。
function RemoveInitialSquareBraces {
printf '%s\n' "$@" |
sed ...
}
したがって、多くのパラメータを受け入れます。
修正する:より一般的な場合は、次の2つの手順で作業を実行できます。
sed -e "
s/\[.*\[.*\][^[]*\]/[]/ #remove square brackets inside square brackets
s/\[[^]]*\]{\(.*\)\}/\1/ #lazy strip square brackets and curle brackets
"
次へ追加:Perlを使用できます。grep(Perl拡張を使用したGNU grep):
grep -Po '\[([^][]*\[\w+\][^][]*)*\]{\K.*(?=})'
または同じ正規表現を使用してsed:
sed 's/\[\([^][]*\(\[\w\+\][^][]*\)*\)*\]{\(.*\)}/\3/'
答え2
これはあなたの入力に適用されます。
sed -Ee's/.*(\{[^}]*(\{[^{}]*\}[^{]*)*\})/\1/'
{foo bar 1}'
{foo bar 2}'
{foo[3]{xyz} bar 3}'
{foo $sq[3]{xyz}$ bar 4}'
{foo $sq[3]{xyz}$ bar 5}'
{foo $sq[3]{xyz}$ bar 6}'
{foo $sq[3]{xyz}$ bar 7}'
{foo $sq[3]{xyz}$ bar 8}'
{foo $sq[abc]{xyz}$ bar 9}'
{foo $sq[abc]{xyz}$ bar 10}'
これは、他の一致するカールペアを完全に含むことができる行で、一致するカールペアが最後に発生する前にすべてを削除します。