현재 입력은 명령에서 나옵니다.
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
파이프라인의 다음 단계로 전달합니다.
두 번째 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을 더 많이 사용해 보세요. 이 두 명령에 대한 답을 어딘가에서 찾을 수 있습니다.
답변4
Perl로 바꾼 grep -i final_model
다음 필요한 데이터를 캡처합니다.
$ perl -nE '/^final_model=.*\/(test_([^.]+)[^>]+)/ && say "$1\n$2"' assemble.preprocessing
test_F00ME001.inp
F00ME001
첫 번째 캡처 괄호 세트는 마지막 슬래시 뒤에 오는 내용을 캡처합니다. (test_([^.]+)[^>]+)
두 번째 캡처 괄호 세트는 밑줄과 점 사이에 오는 내용을 캡처합니다.
그런 다음 다음 구조를 사용하여 이 두 줄을 변수로 캡처할 수 있습니다.
{ read output1; read output2; } < <(
perl -nE '/^final_model=.*\/(test_([^.]+)[^>]+)/ && say "$1\n$2"' assemble.preprocessing
)
리디렉션 중입니다.프로세스 교체2개의 읽기 명령으로 그룹화됩니다.
$ echo "$output1"
test_F00ME001.inp
$ echo "$output2"
F00ME001