web-dev-qa-db-ja.com

最後の2つのトークンを除くUnixカット

特定のディレクトリのファイル名を解析しようとしています。ファイル名の形式は次のとおりです。

token1_token2_token3_token(N-1)_token(N).sh

区切り文字'_'を使用してトークンを切り取り、最後の2つのトークンを除いて文字列を取得する必要があります。上記の例では、出力はtoken1_token2_token3である必要があります。

トークンの数は固定されていません。 cutコマンドの-f#-オプションを使用して実行しようとしましたが、解決策が見つかりませんでした。何か案は?

19
user613114

カットあり:

$ echo t1_t2_t3_tn1_tn2.sh | rev | cut -d_ -f3- | rev
t1_t2_t3

revは各行を反転します。 3- in -f3-は、3番目のフィールドから行の終わりまでを意味します(これは、反転されていないテキストの最後から3番目のフィールドを通る行の始まりです)。

35
ysth

POSIXで定義されたパラメーター置換を使用できます。

$ name="t1_t2_t3_tn1_tn2.sh"
$ name=${name%_*_*}
$ echo $name
t1_t2_t3
6
Rubens

cutでは実行できませんが、sedまたはawkは使用できます。

sed -r 's/(_[^_]+){2}$//g'
3
Shiplu Mokaddim

Ysthの答えを書くためのちょうど別の方法

echo "t1_t2_t3_tn1_tn2.sh" | rev |カット-d "_" -f1,2 --complement | rev

1
Rahul