2014-12-30 2 views
0

내가 가진/bash는 특수 문자 후 문자를 제거 쉘 파일 이름쉘 명령은

hello_1.0_25.tgz 
a_hello_1.25.6_154.tgz 
<name>_<name1>.tgz 

나는 떠들썩한 파티에서 특수 문자 _ 전에 문자열을 얻을 수있는 방법

hello_1.0 
a_hello_1.25.6 
<name> 

입니다 필요 출력 (또는) 껍질?

답변

4

,이 쉽습니다 :

$ f=hello_1.0_25.tgz 
$ echo "${f%_*}" 
hello_1.0 

${f%_*} 단순히 변수 f의 끝에서 후 _ 아무것도를 제거합니다.

외부 도구를 사용하는 다른 방법보다 간결하며 추가 프로세스가 필요없는 경우 저장합니다.

more tips on string manipulation in bash

+3

작업에 적합한 도구를 사용하는 것이 좋습니다. 좋은 오래된'하위 문자열 추출과 매개 변수 확장'. 잘 했어. –

2

뭔가 테스트가 무엇

$ echo "hello_1.0_25.tgz" | sed -r 's/(.*)_.*/\1/' 
hello_1.0 
$ echo "a_hello_1.25.6_154.tgz" | sed -r 's/(.*)_.*/\1/' 
a_hello_1.25.6 
$ echo "<name>_<name1>.tgz" | sed -r 's/(.*)_.*/\1/' 
<name> 

sed -r 's/(.*)_.*/\1/' 

같은?

  • s 대체 명령

  • (.*)은 지난 _까지 모든 항목과 일치합니다. 나머지

  • /\1/ 다음 \1

  • _.* 경기 _에 저장 \1, 첫번째 캡쳐 그룹으로 대체

또는

sed -r 's/_[^_]+$//' 

테스트는 무엇

$ echo "hello_1.0_25.tgz" | sed -r 's/_[^_]+$//' 
hello_1.0 
$ echo "a_hello_1.25.6_154.tgz" | sed -r 's/_[^_]+$//' 
a_hello_1.25.6 
$ echo "<name>_<name1>.tgz" | sed -r 's/_[^_]+$//' 
<name> 

?

  • [^_]+_ 이외의 일치합니다.+ 이전 패턴을 quantifes 한 번 이상

  • $로 대체 라인

  • //의 끝을 일치하는이 라인이해야 할 나오지

+0

감사는 그 개념이 명확 할 것이다, 그래서 당신은 또한 설명을 적어주세요 수 : – Pratik

+1

을하고있다? – Pratik

+0

@ user3003758 당신은 환영합니다 :) 설명을 추가했습니다. 지금 당신을 위해 명확한 희망 – nu11p01n73R

1

빈 :

sed 's/_[^_]*$//' 

시험에 약간의 테스트 제작 :

kent$ cat f 
hello_1.0_25.tgz 
a_hello_1.25.6_154.tgz 
<name>_<name1>.tgz 

kent$ sed 's/_[^_]*$//' f 
hello_1.0 
a_hello_1.25.6 
<name> 

AWK 확실히 너무 그것을 수행 할 수 있습니다

kent$ grep -Po '.*(?=_[^_]*$)' f 
hello_1.0 
a_hello_1.25.6 
<name> 

및 @ 톰 Fenech의 bash는 방법은 다음과 같습니다

kent$ awk -F_ -v OFS="_" 'NF--' f 
hello_1.0 
a_hello_1.25.6 
<name> 

또는 그렙당신이 좋아하는 경우 좋은 너무. 배쉬에서

0

awk가 수행해야합니다

awk -F_ '{$NF="";sub(/_$/,"")}1' OFS=_ file 
hello_1.0 
a_hello_1.25.6 
<name> 

-F_ 설정 필드 구분을 _
$NF=""로는 마지막 필드를 제거합니다.
sub(/_$/,"") 마지막으로 출원 된 구분 기호를 제거합니다.
1 모든 줄을 인쇄합니다.

+2

Awk는 아마도 과장 할 것입니다 (설명하지 않은 경우). – Pureferret

+0

'awk -F_ 'NF--'OFS = _ file' –

+0

@Jidder'NF'가 음수가되기 때문에 공백 행이 있으면 실패합니다. 이것은 오류없이 작동하지만 빈 줄'awk -F_ '을 제거합니다 NF && NF--'OFS = _ file' – Jotne

0

substring extraction에 약간의 변화 : 기본적으로 ${m/#*_/}마지막 _ = 154.tgz (stuff를 호출) 다음과 같은 텍스트를 찾을 말한다

$ m="a_hello_1.25.6_154.tgz" 
$ echo "${m/%_${m/#*_/}/}" 
$ a_hello_1.25.6 

; 그리고 문자열의 백엔드에서 밑줄이 뒤에 붙어이를 제거합니다.${m/%_stuff/}. ${m/%_${m/#*_/}/}의 완전한 표현식.

0

시도해보십시오.배쉬 정규 표현식으로

sed 's/\(.*\)_\.*/\1/g' file_name 
0

:

$ f=hello_1.0_25.tgz 
$ if [[ $f =~ (.*)_.*\.tgz$ ]]; then echo "${BASH_REMATCH[1]}"; fi 
hello_1.0 
관련 문제