使いたい 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
echo '123|456|789' | sed 's/|.*//'
echo '123|456|789' | sed 's/^[0-9]*|//;s/|.*//'
echo '123|456|789' | sed 's/.*|//'
echo '123|456|789' | sed 's/|/ /g'
または使用することを価値があると思わない場合sed
echo '123|456|789' | cut -f1 -d\|
echo '123|456|789' | cut -f2 -d\|
echo '123|456|789' | cut -f3 -d\|
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/|/ /'