切り込みながら切る方法【閉じる】

切り込みながら切る方法【閉じる】

現在の入力はコマンドから出力されます。

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

関連情報