0

ファイル a.txt に文字列があります

{moslate}alho{/moslate}otra{moslate}a{/moslate}

otrased を使用して文字列を取得する必要があります。

この正規表現で

sed 's|{moslate}.*{/moslate}||g' a.txt

a はまったく出力されませんが?、正規表現に a を追加すると

s|{moslate}.*?{/moslate}||g a.txt

(正規表現が貪欲でなくなることをどこかで読んだことがあります)まったく一致しません。つまり、次の出力が得られます

{moslate}alho{/moslate}otra{moslate}a{/moslate}

sed を使用して必要な出力を取得するにはどうすればよいですか?

4

3 に答える 3

6

SED は非貪欲なマッチングをサポートしていないため、「.*」という用語が受け入れるものをより厳選して、貪欲さを軽減する必要があります。私はあなたが探している種類のコーパスを持っていませんが、中括弧が埋め込まれたものは何も見つけたくないと仮定します. もしそうなら、あなたは使うことができます:

sed 's|{moslate}[^{]*{/moslate}||g' a.txt

あなたが与えた場合にはうまくいきますが、これらが入れ子になっていると失敗します。

于 2010-06-01T20:17:01.823 に答える
4

モスレート間の文字列に中括弧が含まれないことがわかっている場合は、次のようにすることができます。

sed 's/{moslate}[^{}]*{\/moslate}//g'
于 2010-06-01T20:14:39.813 に答える
2

「取得する必要がある」 - コンテキストに基づいて、「取得」とは「削除」を意味するように思われます。ただし、通常、「取得」は「取得」または「保持」を意味すると解釈します。あなたのsedコマンドは「すべてを削除する」ということです。希望する出力はどのようになりますか?

「取得」または「保持」を意味すると仮定して、これを試してください:

sed -n 's|.*{/moslate}\([^{]*\){moslate}.*|\1|p' a.txt

これは、「otra」または「otra」がその文字列で占める位置 (つまり、「moslate」タグの 2 つのセットの間) にあるものを取得します。

結果の出力:

otra

「otra」を削除したい場合:

sed 's/otra//' a.txt

出力:

{moslate}alho{/moslate}{moslate}a{/moslate}

その文字列で「otra」が占めている位置 (つまり、「moslate」タグの 2 つのセットの間) にあるものをすべて削除したい場合:

sed -n 's|\(.*{/moslate}\)[^{]*\({moslate}.*\)|\1\2|p' a.txt

出力:

{moslate}alho{/moslate}{moslate}a{/moslate}
于 2010-06-01T22:29:52.150 に答える