ファイルtest.txt
があり、次の結果が含まれています。
service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl
などservice_name1500
まで
次のような出力が必要です:
Egg 12.34.56
joker 23.45.67
など:バージョン番号とその前のWord。
これは単純なcut
ジョブである必要があります。
cut -d/ -f5,6 --output-delimiter=" "
-d/
は、入力区切り文字を/
として設定します-f5,6
は、5番目と6番目のフィールドのみを出力します--output-delimiter=" "
は、出力区切り文字をスペースとして設定しますawk
、awk
についても同じことがデフォルトで出力フィールドの区切りをスペースとして設定します。
awk -F/ '{print $5,$6}'
例:
% cat file.txt
service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl
% cut -d/ -f5,6 --output-delimiter=" " file.txt
Egg 12.34.56
joker 23.45.67
% awk -F/ '{print $5,$6}' file.txt
Egg 12.34.56
joker 23.45.67
sed
ソリューション(バージョン文字列のフィールド位置が一貫しているかどうかにかかわらず機能しますが、バージョン文字列の形式は一貫している必要があります)
$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*#\1 \2#' test.txt
Egg 12.34.56
joker 23.45.67
-r
EREを使用するので、()
メタキャラクターをエスケープする必要はありませんs#old#new#
パターンold
を検索し、new
に置き換えます.*
は、この位置の文字に一致するか、文字なしに一致します(stuff)
後で覚えるstuff
[0-9]{2}\.[0-9]{2}\.[0-9]{2}
[2桁]。[2桁]。[2桁]のパターン\1 \2
間にスペースがある2つの記憶されたパターンこれはそれを行います:
cut -d'/' -f5-6 test.txt | tr -s "/" " "
Wordの固定位置を扱う場合、これは機能します。
grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt
説明:
.*
の先頭と末尾は、次と一致しないすべての文字をカットします([[:alpha:]]+)
括弧内の最初のサブグループはアルファベット文字のみに一致します\/
は、切り取られるスラッシュと一致します([\.0-9]*)
は、数字とポイントに一致し、2番目のレジスタに格納します/
の後に\1 \2
で置換すると、一致したサブグループから最初と2番目のレジスタが挿入されます長いが動作しているpythonワンライナー:
$ python -c "import sys;print '\n'.join([ ' '.join(l.strip().split('/')[4:6]) for l in sys.stdin])" < input.txt
Egg 12.34.56
joker 23.45.67
使い方:
<
を含む入力ファイルをPythonのstdinストリームにリダイレクトします[item for item in sequence]
を使用して、stdinを1行ずつ読み取ります.split()
は、/
をセパレータとして使用して、行を単語のリストに分解します' '.join()
を使用して文字列を作成します'\n'.join()
を使用してそれらを行に変換し、すべて出力します