SEDを使用した文字列からの値の導出

SEDを使用した文字列からの値の導出

使いたい echo "123|456|789" | sed 's/^\(.*|\)\(.*|\).*$/\1'

文字列を破棄して個々の値を取得しようとしています(パイプなし)。

  • シーン1:欲しい123
  • シーン2:欲しい456
  • シーン3:欲しい789
  • シーン4: 私は得たいと思う123 456 789

答え1

何をしたいのか分からないので、修理コマンドで回答を制限します。それが必要です:

エコ「123|456|789」 sed /^(。|)(。|).*$/\1/'

(最後の引用符の前に/があることに注意してください)

その後、出力を提供します。

123 |

これはあなたが望むものですか?

答え2

  1. echo '123|456|789' | sed 's/|.*//'
  2. echo '123|456|789' | sed 's/^[0-9]*|//;s/|.*//'
  3. echo '123|456|789' | sed 's/.*|//'
  4. echo '123|456|789' | sed 's/|/ /g'

または使用することを価値があると思わない場合sed

  1. echo '123|456|789' | cut -f1 -d\|
  2. echo '123|456|789' | cut -f2 -d\|
  3. echo '123|456|789' | cut -f3 -d\|
  4. echo '123|456|789' | cut -f1,2,3 --output-delimiter=" " -d\|

答え3

私の以前の答えはバグを修正しました。私が実際に解決した方法は次のとおりです。

シナリオ4は最も複雑なので、回避策は次のとおりです。

echo '123|456|789' | sed 's/\([0-9]*\)|\([0-9]*\)|\([0-9]*\)/\1 \2 \3/'

最後の\1、\2、\3は、「装飾括弧」(\(および\))の間で一致する部分を選択します。各グループは次の番号で参照されるため、\ 1は最初のグループを表す式です。

シナリオ1、2、3の場合は単純化できますが、必要に応じて切り取り、貼り付けてから//の最後のグループの間に\ 1、\ 2、または\ 3を追加する方が簡単です。残りの装飾用括弧をそのままにしても問題になりません。

このソリューションは任意の数のフィールドに拡張できますが、可能であればcutを使用する方が良いと思います。

答え4

GNU sedを使用すると、シェルvarでフィールド番号を参照してフィールドをキャプチャできます。$n

n=2; # to get field number 2
echo "123|456|789" | sed -n "s/|/\n/$n;s/^[^\n]*|//;P"

シナリオ 4 の場合、次のようになります。

echo ... | sed -e 'y/|/ /'

関連情報