パイプラインコマンドで条件文を使用する方法は? [閉鎖]

パイプラインコマンドで条件文を使用する方法は? [閉鎖]

処理されるデータは特定のパターンに従います。この場合、3番目の列のすべての文字を区切ります。「-」ただし、列に区切り文字がある場合にのみ該当します。それ以外の場合は何も返すべきではありません。

eval $A=$(echo $1 | awk -F"." '{print $3}' | cut -d\- -f2-)

最初のawk文は文字列を次のように分割します。

111
222
333-ab3-On21-2

このcutコマンドは、最初の「-」の後の文字を印刷します。

文字列1 111.2222.333-ab3-On21-2目的の結果を返します。

ab3-On21-2

文字列2 111.2222.334不要な結果を返します。

333

文字列の最後の部分には区切り文字はありません"-"。この場合、このコードを0または ""を返すように変更するにはどうすればよいですか?

答え1

あなたの声明に条件がないので、「条件」をどこで得たのかわかりません。awk -F- {print}有用な作業は実行せず、入力を出力に渡します。

ただし、式を使用してsedパイプライン全体を簡素化したい操作を実行できます。

sed -n 's/.*\.[^-]*-\(.*\)/\1/p'

-npこれは、式に一致する文字列のみを印刷することを意味します。

この式は最後の項目まで削除し、.最初の項目より前のすべての項目を削除します-

だから:

% echo 111.2222.333-ab3-On21-2 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p'
ab3-On21-2
% echo 111.2222.333 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p'           
% 

入力がより複雑な場合(たとえば、4つの.区切られたフィールド)、スキーマはよりスマートになる必要があるかもしれません。

sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'

例えば

% echo 111.2222.333-ab3-On21-2.999 | sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'
ab3-On21-2

答え2

grep -o -P '[^.]*\.[^.]*\.[^-]*-\K.*'

最初は前方ナビゲーションを使用しようとしましたが、固定長ではない正規表現では機能しません。その後、インターネット検索を行ったところ、Perlに\Kリセットマッチトークンがあることがわかりました。

例:

grep -o -P '[^.]*\.[^.]*\.[^-]*-\K.*' <<< 111.222.333-ab3-0n21-2

ab3-0n21-2
grep -o -P '[^.]*\.[^.]*\.[^-]*-\K.*' \
  <<< '128-2sd83--.3 832 @!@!# 323.7 dskj ...-ab3-0n21-2'

ab3-0n21-2

答え3

cut-s(または)オプションと一緒に使用してください--only-delimited

printf '%s\n' '111.2222.333-ab3-On21-2' '111.2222.334' | 
cut -d '.' -f 3 | cut -d '-' -sf 2-

出力:

ab3-On21-2

関連情報