다음과 같은 파일 이름 형식의 파일이 있습니다.
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"}'