文字の最初のインスタンスとすべての後続の文字を置き換えるようにsedコマンドを改善しますか?

文字の最初のインスタンスとすべての後続の文字を置き換えるようにsedコマンドを改善しますか?

入力する:

<e1 name="file1" id="id1" anotherId="id2">

希望の出力:

file1

次のように必要なものを入手できます。

echo '<e1 name="file1" id="id1" anotherId="id2">' | sed 's/\(.*name="\)\(.*\)\(".*\)/\2/' | sed 's/".*//'

出力:file1

可能であれば、コマンドセットを改善し、sedの最後のパイプを削除したいと思います。 sedの最後のパイプを削除すると、目的の結果が得られません。

echo '<e1 name="file1" id="id1" anotherId="id2">' | sed 's/\(.*name="\)\(.*\)\(".*\)/\2/'

出力:

file1" id="id1" anotherId="id2

ご覧のとおり、sedはfile1の後の最初の引用符ではなく、最後の引用符を選択しました。

誰でもこのコマンドを改善するのに役立ちますか?

ベストアンサー1

echo '<e1 name="file1" id="id1" anotherId="id2">' |
  sed -n 's/.*name="\([^"]*\)".*/\1/p'

またはGNUを使用する(grepPCREサポートで構築されている場合):

echo '<e1 name="file1" id="id1" anotherId="id2">' |
  grep -Po 'name="\K[^"]*'

おすすめ記事