내가 가진/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>
입니다 필요 출력 (또는) 껍질?
내가 가진/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>
입니다 필요 출력 (또는) 껍질?
,이 쉽습니다 :
$ f=hello_1.0_25.tgz
$ echo "${f%_*}"
hello_1.0
${f%_*}
단순히 변수 f
의 끝에서 후 _
아무것도를 제거합니다.
외부 도구를 사용하는 다른 방법보다 간결하며 추가 프로세스가 필요없는 경우 저장합니다.
뭔가 테스트가 무엇
$ 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 한 번 이상
$
로 대체 라인
//
의 끝을 일치하는이 가 라인이해야 할 나오지
감사는 그 개념이 명확 할 것이다, 그래서 당신은 또한 설명을 적어주세요 수 : – Pratik
을하고있다? – Pratik
@ user3003758 당신은 환영합니다 :) 설명을 추가했습니다. 지금 당신을 위해 명확한 희망 – nu11p01n73R
빈 :
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>
또는 그렙당신이 좋아하는 경우 좋은 너무. 배쉬에서
이 awk
가 수행해야합니다
awk -F_ '{$NF="";sub(/_$/,"")}1' OFS=_ file
hello_1.0
a_hello_1.25.6
<name>
-F_
설정 필드 구분을 _
$NF=""
로는 마지막 필드를 제거합니다.
sub(/_$/,"")
마지막으로 출원 된 구분 기호를 제거합니다.
1
모든 줄을 인쇄합니다.
Awk는 아마도 과장 할 것입니다 (설명하지 않은 경우). – Pureferret
'awk -F_ 'NF--'OFS = _ file' –
@Jidder'NF'가 음수가되기 때문에 공백 행이 있으면 실패합니다. 이것은 오류없이 작동하지만 빈 줄'awk -F_ '을 제거합니다 NF && NF--'OFS = _ file' – Jotne
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/#*_/}/}
의 완전한 표현식.
시도해보십시오.배쉬 정규 표현식으로
sed 's/\(.*\)_\.*/\1/g' file_name
:
$ f=hello_1.0_25.tgz
$ if [[ $f =~ (.*)_.*\.tgz$ ]]; then echo "${BASH_REMATCH[1]}"; fi
hello_1.0
작업에 적합한 도구를 사용하는 것이 좋습니다. 좋은 오래된'하위 문자열 추출과 매개 변수 확장'. 잘 했어. –