現在の入力はコマンドから出力されます。
grep -i "final_model" /dir1/dir2/dir3/user/dir4/assemble.preprocessing
現在の出力は次のとおりです。
final_model=</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>
必須出力-1は次のとおりです。
test_F00ME001.inp
必要な出力-2は次のとおりです。
F00ME001
答え1
私たちが言うと
final_model=</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>
grep
コマンドで生成されたテキスト行。
grep ... | sed 's#.*/##; s/>$//' | tee output1 |
sed 's/^[^_]*_//; s/\..*//' >output2
output1
これにより、変更された行がすべておよびに保存されます。output2
テスト:
$ printf '%s\n' 'final_model=</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>' |
sed 's#.*/##; s/>$//' | tee output1 |
sed 's/^[^_]*_//; s/\..*//' >output2
$ cat output1
test_F00ME001.inp
$ cat output2
F00ME001
最初のsed
呼び出しは生データに対して機能し、最初に/
最後の文字の前のすべての項目を削除します。次に>
最後の項目を削除します。
保存tee
し、output1
パイプラインの次のステップに渡します。
2番目sed
の呼び出しは変更されたデータに対して機能し、最初に最初の文字の前にあるすべての項目を削除します_
。次に、最初のポイントからすべての項目を削除し、結果をoutput2
。
答え2
同じ効果を得るには、次のコマンドを試してください。
final_model=</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>
o1=`echo $final_model| awk -F "/" '{print $NF}'|sed "s/[^[a-zA-Z_0-9.]//g"`
echo $o1
o2=`echo $o1|awk -F [_.] '{print $2}'`
echo $o2
F00ME001
答え3
$ final_model="</dir1/dir2/dir3/user/dir4/test_F00ME001.inp>"
$ o1=$(echo "$final_model" | sed -e 's/<\(.*\)>/\1/') #remove <>
$ o1=$(basename "$o1") #get basename (test_F00ME001.inp)
$ echo "$o1"
test_F00ME001.inp
$ o2=$(echo "$o1" | sed -e 's/test_\(.*\)\.inp/\1/') #get text between test_ and .inp
$ echo "$o2"
F00ME001
次にGoogleをもっと試してください。これら2つのコマンドに対する答えはどこかにあります。
sed
コマンドソース:https://stackoverflow.com/a/13242517/7351855
答え4
Perlに置き換えてgrep -i final_model
、必要なデータをキャプチャします。
$ perl -nE '/^final_model=.*\/(test_([^.]+)[^>]+)/ && say "$1\n$2"' assemble.preprocessing
test_F00ME001.inp
F00ME001
最初のキャプチャ括弧セットは、最後のスラッシュの後に続く内容をキャプチャします。(test_([^.]+)[^>]+)
2番目のキャプチャ括弧セットは、アンダースコアとドットの間にある内容をキャプチャします。
その後、次の構造を使用してこれら2行を変数としてキャプチャできます。
{ read output1; read output2; } < <(
perl -nE '/^final_model=.*\/(test_([^.]+)[^>]+)/ && say "$1\n$2"' assemble.preprocessing
)
リダイレクト中です。プロセスの交換2つの読み取りコマンドにグループ化されています。
$ echo "$output1"
test_F00ME001.inp
$ echo "$output2"
F00ME001