그레핑하면서 자르는 방법 [닫기]

그레핑하면서 자르는 방법 [닫기]

현재 입력은 명령에서 나옵니다.

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을 더 많이 사용해 보세요. 이 두 명령에 대한 답을 어딘가에서 찾을 수 있습니다.

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_([^.]+)[^>]+)
두 번째 캡처 괄호 세트는 밑줄과 점 사이에 오는 내용을 캡처합니다.

그런 다음 다음 구조를 사용하여 이 두 줄을 변수로 캡처할 수 있습니다.

{ read output1; read output2; } < <(
    perl -nE '/^final_model=.*\/(test_([^.]+)[^>]+)/ && say "$1\n$2"' assemble.preprocessing 
)

리디렉션 중입니다.프로세스 교체2개의 읽기 명령으로 그룹화됩니다.

$ echo "$output1"
test_F00ME001.inp
$ echo "$output2"
F00ME001

관련 정보