3

ファイル名がこの形式の場合

assignment_number_username_filename.extension

元。

assignment_01_ssaha_homework1.txt

スクリプトの残りの部分で使用するには、ユーザー名だけを抽出する必要があります。

ユーザー名だけを取得して引数として使用するにはどうすればよいですか。

これは私が探しているものに近いですが、正確ではありません:

ファイル名から文字列を抽出する

誰かがそのシナリオでsedがどのように機能するかを説明できれば、それも同じように役立ちます!

これが私がこれまでに持っているものです。cutしばらく使用していないので、リフレッシュしようとするとエラーメッセージが表示されます。

 #!/bin/sh 
 a = $1
 grep $a /home | cut -c 1,2,4,5 echo $a`
4

3 に答える 3

1

おそらくコマンド置換とプラスが必要echoですsedsed正規表現が一致の一部を記憶できることを知っておく必要があります。そして、基本的な正規表現を知る必要があります。コンテキストでは、これは次のようになります。

filename="assignment_01_ssaha_homework1.txt"

username=$(echo "$file" | sed 's/^[^_]*_[^_]*_\([^_]*\)_[^.]*\.[^.]*$/\1/')

表記は$(...)コマンド置換です。括弧の間にあるコマンドが実行され、出力が文字列としてキャプチャされます。この場合、文字列は変数に割り当てられますusername

sedコマンドでは、コマンド全体が特定の置換()s/match/replace/操作を入力の各行に適用します(ここでは、1行になります)。正規表現の[^_]*コンポーネントは、(0個以上の)非アンダースコアのシーケンスと一致します。この\(...\)部分は、囲まれた正規表現(アンダースコア以外の3番目のシーケンス、別名ユーザー名)を記憶しています。最後のへの切り替えは[^.]*、アンダースコアからドットへの区切り文字の変更を認識します。置換テキスト\1は、名前全体をパターンの記憶された部分に置き換えます。一般に、パターンのいくつかのサブセクションを覚えておくことができます。ファイル名がパターンと一致しない場合は、入力を出力として取得します。

には、 ;bashを回避する方法があります。echoより難解な(「他のシェルでは使用できない」という意味の)メカニズムのいくつかを使用して、データを抽出できる可能性があります。これは、最新のPOSIX派生シェルの大部分(Korn、Bashなど)で機能します。

于 2012-04-05T04:13:46.347 に答える
0
filename="assignment_01_ssaha_homework1.txt"

username=$(echo "$file" | awk -F_ '{print $3}')
于 2012-04-05T05:54:26.477 に答える
0

バッシュするだけです:

filename="assignment_01_ssaha_homework1.txt"
tmp=${filename%_*}
username=${tmp##*_}

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

于 2012-04-05T14:54:57.800 に答える