22

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

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

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

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

4

4 に答える 4

44

カットあり:

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

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

于 2012-12-23T11:08:18.673 に答える
7

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

$ name="t1_t2_t3_tn1_tn2.sh"
$ name=${name%_*_*}
$ echo $name
t1_t2_t3
于 2012-12-23T11:17:27.953 に答える
5

ではできませんがcut、使用できますsed

sed -r 's/(_[^_]+){2}$//g'
于 2012-12-23T11:06:40.600 に答える
1

ysthの答えを書く別の方法:

echo "t1_t2_t3_tn1_tn2.sh" |rev| cut -d"_" -f1,2 --complement | rev
于 2015-08-18T10:10:31.857 に答える