処理されるデータは特定のパターンに従います。この場合、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'
-n
p
これは、式に一致する文字列のみを印刷することを意味します。
この式は最後の項目まで削除し、.
最初の項目より前のすべての項目を削除します-
。
だから:
% 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