1

<sometag param='との間の文字列を取得したい'>

Get any string between 2 string and assign a variable in bashのメソッドを使用して、「x」を取得しようとしました。

 echo "<sometag param='x'><irrelevant stuff='nonsense'>" | tr "'" _ | sed -n 's/.*<sometag param=_\(.*\)_>.*/\1/p'

問題は(sedのアポストロフィを正しくエスケープできないため、効率が低いことを除けば)、sedが最大値に一致することです。つまり、出力は次のようになります。

 x_><irrelevant stuff=_nonsense

ただし、正しい出力は最小一致であり、この例では単に「x」です

ご協力いただきありがとうございます

4

2 に答える 2

3

あなたはおそらく次のようなものを探しています:

sed -n "s/.*<sometag param='\([^']*\)'>.*/\1/p"

テスト:

echo "<sometag param='x'><irrelevant stuff='nonsense'>" | sed -n "s/.*<sometag param='\([^']*\)'>.*/\1/p"

結果:

x

説明:

  • 貪欲なキャプチャの代わりに、次のような貪欲でないキャプチャを使用します。これは、任意の回数を[^']* 除いてすべてに一致することを意味します。'パターンを定着させるために、この後に'>.
  • 単一引用符をエスケープする必要がないように、二重引用符を使用することもできます。一重引用符をエスケープしたい場合は、次のようにします。

-

... | sed -n 's/.*<sometag param='\''\([^'\'']*\)'\''>.*/\1/p'

一重引用符が実際にはエスケープされていないことに注意してください。式が停止されsed、エスケープされた一重引用符が挿入され、sed式が再び開かれます。4 文字のエスケープ シーケンスのように考えてください。


個人的には、GNU grep. それは少し短い解決策になります。次のように実行します。

... | grep -oP "(?<=<sometag param=').*?(?='>)"

テスト:

echo "<sometag param='x'><irrelevant stuff='nonsense'>" | grep -oP "(?<=<sometag param=').*?(?='>)"

結果:

x
于 2012-12-19T05:39:32.280 に答える
0

これらの場合、正規表現を組み立てる必要はありません。フィールドセパレーターとして ' を使用するだけです

in="<sometag param='x'><irrelevant stuff='nonsense'>"

IFS="'" read x whatiwant y <<< "$in"            # bash
echo "$whatiwant"

awk -F\' '{print $2}' <<< "$in"                 # awk
于 2012-12-19T15:39:29.513 に答える