문자열에서 두 번째 및 마지막 필드 캡처

문자열에서 두 번째 및 마지막 필드 캡처

다음과 같은 파일 이름 형식의 파일이 있습니다.

VER_{파일 이름}_{버전}

  VER_collect_important_info.pl_1.0.2

우리는 "파일 이름"과 "버전" 번호만 캡처하고 싶습니다.

그러면 "파일 이름"과 "버전"을 캡처할 수 있도록 파일 이름에서 첫 번째 _와 마지막 _을 제거하려면 어떻게 해야 합니까(sed/awk 또는 Perl one-liner 사용)

 echo VER_collect_important_info.pl_1.0.2 | <some syntax>

 collect_important_info.pl  1.0.2

답변1

Perl은 가벼운 대안보다 나에게 더 자연스러운 느낌을 줍니다.

echo VER_collect_important_info.pl_1.0.2 | perl -pe 's/^[^_]*_(.*)_(.*)$/$1 $2/'

이것이 필요 이상으로 더 무거운 가중치를 사용하는 것이 중요하지 않다면 여기서 멈추겠습니다.

sed는 이를 수행할 수 있지만 괄호와 같은 기본 요소를 이스케이프 처리해야 한다는 점은 번거롭습니다.

echo VER_collect_important_info.pl_1.0.2 | sed 's/VER_\(.*\)_\(.*\)/\1 \2/'

답변2

이것은 트릭을 수행해야합니다

$ echo VER_collect_important_info.pl_1.0.2 | sed 's/_/ /' | sed -r 's/(.*)_/\1 /' | awk -F" " '{print $2"\t"$3}'

첫 번째 sed는 첫 번째 항목을 대체하고 _, 두 번째 sed는 마지막 항목을 대체하고 _, 마지막으로 awk로 인쇄합니다.

답변3

$ echo 'VER_collect_important_info.pl_1.0.2' | 
    perl -F_ -lane 'print join("_", @F[1..@F-2]), " ", @F[@F-1]'
collect_important_info.pl 1.0.2

참고: perl배열은 1이 아닌 0에서 시작하므로 두 번째 필드의 배열 인덱스는 [1]가 아니라 입니다 [2].

그러면 입력이 @F밑줄 문자로 구분된 배열( )로 분할됩니다. _그런 다음 두 번째 필드를 두 번째에서 마지막 필드( @F[1..@F-2])까지 인쇄하고 밑줄로 연결한 다음 공백, 마지막 필드( @F[@F-1])를 인쇄합니다.

답변4

awk를 사용하면 다음을 사용할 수 있습니다.

echo VER_collect_important_info.pl_1.0.2 | awk -F '_' '{for (i=2; i<NF; i++) {{printf $i} if (i!=NF-1) printf "_"} printf " " $NF "\n"}'

관련 정보