하위 푸십시오 bash

',' 내가 원하는 형태로 주어진 파일_이름 someletters_12345_moreleters.ext 푸십시오 가변적입니다 5 자리, 동일팔레트에 묶습니다.

So, I have a 파일_이름 요점이지 강조하십시오 x 5 자리의 수를 그 후 다른 한 쪽에 e0100042.log 둘러싸인 밑줄 문자 집합 x 개로 성장했다. I want to 시행하십시오 숫자 5 를 하고 있는 편이다.

저는 아주 관심이 있는 다양한 방법으로 이 작업을 수행할 수 있습니다.

질문에 대한 의견 (3)

, 상수입니다 경우 다음과 같은 매개 변수 x 개확장 향상합니다 substring 추출:

b=${a:12:5}

여기서 12 오프셋입니다 (부터 시작하는) 와 5 는 길이 있다.

밑줄 경우 주변의 유일한 수준들과 숫자는 입력 및 접미어입니다 스트립 끕니까 접두어입니다 수 있습니다 (각각) 에 2 단계:

tmp=${a#*_}   # remove prefix ending in "_"
b=${tmp%_*}   # remove suffix starting with "_"

39 의 경우, 아마도 더 많은 양을 최소화하므로 어쨌든, 비록 다른 밑줄 it& 까다로운. 누구나 다 수행할 경우 한 번의 표현식에서는 확장 방법을 알고, I& # 39; d 알고 싶으신 너무.

두 솔루션은 제시된 순결케 bash, 매우 빠르게 업그레이드됨 관련된 프로세스 시작 없이 있다.

해설 (12)
해결책

잘라냅니다 사용합니다.

echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2

좀 더 일반적인:

INPUT='someletters_12345_moreleters.ext'
SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
echo $SUBSTRING
해설 (7)

일반 파일 이름을 사용할 수 있는 솔루션 등, 첫 번째 시퀀스에만 수 있게 되었다.

number=$(echo $filename | egrep -o '[[:digit:]]{5}' | head -n1)

또 다른 솔루션을 푸십시오 정확히요 일부 변수:

number=${filename:offset:length}

이 경우 항상 사용할 수 있습니다. '형식' stuffdigits 파일_이름 있다.

number=$(echo $filename | awk -F _ '{ print $2 }')

또 다른 솔루션을 사용할 것을 제외하고 모두 제거하시겠습니까 자리

number=$(echo $filename | tr -cd '[[:digit:]]')
해설 (1)

c startIndx-stopIndx '그냥' 잘라냅니다 사용하려고 합니다

해설 (7)

누군가 하는 경우에 그 사람이 이렇게 bash 보다 강력한 정보를 검색할 수도 있습니다

$ man bash [press return key]
/substring  [press return key]
[press "n" key]
[press "n" key]
[press "n" key]
[press "n" key]

결과:.

&lt pre>; 매개변수입니다 오프셋할 $ {}: 매개변수입니다 오프셋된 길이 $ {} 문자열 했다. 최대 길이 문자를 확장됨 문자 시작하여 매개변수입니다 지정된 오프셋입니다. 만약 문자열의 길이가 빠졌고, 확장되어 매개변수 시작 - ing 에 의해 지정된 문자 오프셋입니다. 길이와 오프셋된 있다. 산술 표현식에서는 (http://otl. 산술 평가 참조). 만약 제로, 값 (value) 로 평가되는 오프셋할 보다 작은 수를 사용됩니다. 오프셋된 표시됨과 및끝 가치가 매개변수입니다. 산술 표현식에서는 시작으로 공백을 구분해야 합니다 - &solarisdvd 이전. 구분할 수 있는 기본 사용 값을 했다. 길이 로 평가되는 경우 보다 작은 수를 제로 및 파라메트가 아닌 인덱스된 또는 연관 없는 @ 이는 오프셋된 표시됨과 어레이로써, the end of the value 대신 문자 수를 매개변수 및 익스팬전자 - 시옹 () 는 둘 사이의 문자이어야 offsets. 만약 파라메트가 @, 그 결과 길이 시작하여 위치 매개변수입니다 끄기도구 - 설정되었습니다. 이름 아래 있는 경우 또는 파라메트가 인덱스된 어레이입니다 의해 @ *, 그 결과 소속 어레이입니다 디스테이징하는 시작으로 $ {매개변수입니다 [오프셋된]}. 부정적인 것은 상대적인 조롱했기 오프셋할 1 보다 최대 색인입니다 지정된 어레이입니다. 서브노드 - 연관 배열 확장이 적용된 문자열이어야 운데 만듭니다. - 벌금 결과를 얻을 수 있습니다. 단, 제외어 오프셋된 분판된 있어야 합니다. 적어도 한 공간에 의해 혼동하지 않도록 하기 위해 &solarisdvd 콜론

  • 함께 했다. 문자열 인덱스화를 부터 시작하는 경우는 있다. 이 때, 이 경우 인덱스화를 매개변수입니다 위치 기본적으로 1 시에 시작합니다. 이 경우 0 을 오프셋할 위치 매개변수입니다 사용할 경우 $0 이 목록에 제작 기업이다. &lt /pre>;
해설 (1)

39 을 기반으로 jor& 오토메이티드 (디스크입니다. doesn& # 39, t 작동합니까 가져다줄래요):

substring=$(expr "$filename" : '.*_\([^_]*\)_.*')
해설 (1)

39, m, t # 39 이 배시 솔루션이므로 didn& 순결케 i& 많이 와요.

a="someletters_12345_moreleters.ext"
IFS="_"
set $a
echo $2
# prints 12345

아마 어떤 가치를 IFS 재설정하려면, 또는 '전의' 이후 IFS 해제할!

해설 (3)

39 의 here& 어떻게 i& # 39; d do it.

FN=someletters_12345_moreleters.ext
[[ ${FN} =~ _([[:digit:]]{5})_ ]] && NUM=${BASH_REMATCH[1]}

참고: 위의 다섯 자리 () 는 고객의 특정 정규식이 및 제한되는지 시나리오를 둘러싸여 있음을 보여준다. 정규식이 변경하십시오 필요한 경우 다른 일치.

해설 (3)

다음 요구 사항

&gt. I have a 파일_이름 x 5 자리 다음 글자 수를 &gt. 한 후 다른 어느 한 쪽에 e0100042.log 둘러싸인 밑줄 &gt. 집합 x 개로 성장했다. I want to 시행하십시오 5 자리 번호 및 &gt. 그거 붙여넣습니다 변수다.

'일부' 그렙 유용할 수 있는 방법을 찾았다.

$ echo "someletters_12345_moreleters.ext" | grep -Eo "[[:digit:]]+" 
12345

이상의

$ echo "someletters_12345_moreleters.ext" | grep -Eo "[[:digit:]]{5}" 
12345

그리고 '와' po 구문.


$ echo "someletters_12345_moreleters.ext" | grep -Po '(?
해설 (1)

하위 프로세스 없이 수 있습니다.

shopt -s extglob
front=${input%%_+([a-zA-Z]).*}
digits=${front##+([a-zA-Z])_}

또한 매우 작은 ksh93 작업하십시오 것이다.

해설 (0)

<! - 모든 언어: &gt 랑 sh -; 만약 우리가 이 개념은 집중적으로 of:&lt br>; (하나 또는 여러) 의 &quot 매핑되며, 실행하십시오 digits&quot.

우리는 여러 외부 도구로 사용할 수 있는 푸십시오 numbers.&lt br>; 우리가 할 수 있고, sed 또는 다른 문자는 모두 매우 쉽게 지우기입니다 tr:&lt br>;

name='someletters_12345_moreleters.ext'

echo $name | sed 's/[^0-9]*//g'    # 12345
echo $name | tr -c -d 0-9          # 12345

이름에 숫자, 위의 여러 런입니다 신앙이니라 $ 는 br&gt fail:<;

= someletters_12345_moreleters_323_end.ext&quot &quot 경우, 이름, 후:

echo $name | sed 's/[^0-9]*//g'    # 12345323
echo $name | tr -c -d 0-9          # 12345323

우리는 일반 엑스프레시언스 사용해야 하는 (regex). 하나만 선택할 수 있는 첫 번째 실행하십시오 sed (12345 필터링되지 323) 와 펄 (perl):

echo $name | sed 's/[^0-9]*\([0-9]\{1,\}\).*$/\1/'
perl -e 'my $name='$name';my ($num)=$name=~/(\d+)/;print "$num\n";'

하지만 우리는 그렇게 할 수 있는, (1) , 뿐만 아니라 직접 bash*&l sup&gt &lt /sup>; .

regex=[^0-9]*([0-9]{1,}).*$; \
[[ $name =~ $regex ]] && echo ${BASH_REMATCH[1]}

이 첫 번째 숫자 실행하십시오 푸십시오 모든 길이 있습니다 다른 모든 둘러싸인 text / 문자.

  • 참고 : ' [^ 0-9] regex = $ ([0-9]} {5.5),' 제공합니다.* 명에만 정확히요 5 자리 런입니다. -)

&lt sup&gt &lt /sup>;;; (1): 외부 도구에서는 호출하십시오 보다 각 파선-짧은 등장한다. Sed 또는 모든 처리를 하는 것은 대용량 파일을 위한 보다 내부에 있다.

해설 (0)

S # 39, here& 접두어입니다 접미어입니다 솔루션 (jb) 와 유사한 솔루션을 제공한 대런) 의 첫 번째 블록이어야 숫자와 일치하는 주변 변화에 의존하지 않는다.

str='someletters_12345_morele34ters.ext'
s1="${str#"${str%%[[:digit:]]*}"}"   # strip off non-digit prefix from str
s2="${s1%%[^[:digit:]]*}"            # strip off non-digit suffix from s1
echo "$s2"                           # 12345
해설 (0)

& # 39, sed 'i love' s 기능마저도 regex 대응하기 위해 그룹:

> var="someletters_12345_moreletters.ext"
> digits=$( echo $var | sed "s/.*_\([0-9]\+\).*/\1/p" -n )
> echo $digits
12345

조금 더 일반화 될 수 있는 옵션이 없는 표시 밑줄 '네 자리 조합으 _' solaris. 시작 전에 모든 비 번호, 예를 들어 분해한 오프하도록 업그레이드됨 확보하십시오 너회의 계열: / [^ 0-9] ([0-9] +) 의 +\ .*/\1/p '.

> man sed | grep s/regexp/replacement -A 2
s/regexp/replacement/
    Attempt to match regexp against the pattern space.  If successful, replace that portion matched with replacement.  The replacement may contain the special  character  &  to
    refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp.

이에 대해 확신을 가질 수 없는 경우, 너무 정규 표현식 함께 # 39 더 you& re:

  • 's' 는 _s_ubstitute
  • '+' 일치시킵니다 1+ 자리 [0-9] 그룹 n '-' \1 링크 regex 출력입니다. 1 (그룹 0 은 전체 일치, 그룹 1 은 해당되어서는 괄호 안에 이 경우)
  • 'p' 플래깅 _p_rinting 캐비닛용입니다

Sed '& # 39 을 만들기 위해' 모든 '\' 이스케이프합니다 발생합니까 정규 표현식 처리 작동합니까.

해설 (0)

파일이 주어진 테스트리트스트 redboot*용 &quot ABCDEFGHIJKLMNOPQRSTUVWXYZ";

cut -b19-20 test.txt > test1.txt # This will extract chars 19 & 20 "ST" 
while read -r; do;
> x=$REPLY
> done < test1.txt
echo $x
ST
해설 (1)

My answer will 더 많은 수의 제어 그리웠댔지 out of your 구체화하십시오. 다음은 코드 진단트리로 '어떻게' out of your 문자열이어야 12345 추출할 수 있습니다

str="someletters_12345_moreleters.ext"
str=${str#*_}
str=${str%_more*}
echo $str

이렇게 하면 더 효율적으로 사용할 수 있는 자 '또는' abc 등 모든 확인표시를 푸십시오 생각하신거야 ' 같은 특수 문자 '또는' - '. 예를 들면 다음과 같습니다. 이런 경우 문자열은 하려면 모든 것을 '와' 후 'someletters 전에 _moreleters.ext':

str="someletters_123-45-24a&13b-1_moreleters.ext"

내 코드를 통해 정확히 어떤 운영까지도 언급할 수 있습니다. 설명:

* '이전' 등 주요 일치하는 문자열을 제거됩니다. 여기서 중요한 것은 우리가 _' 는 '

'%' 등 주요 다음을 분리하십시오 문자열이어야 일치하는 것으로 보인다. # 39, & # 39 는 가장 중요한 것은, 우리가 여기 _more

이 몇 가지 흥미로운 실험을 교도관님도요 진실이며당신이 찾을 수 있을 것 "이라고 말했다.

해설 (0)

자, 여기 순결케 댁이라면 매개변수입니다 대체 비어 있는 구체화하십시오. 으로 정의한 것은 내가 경고 및 섬레터스 모레레터스 문자만. 이 경우, 문숫자 작동하지 않을 수 없다.

filename=someletters_12345_moreletters.ext
substring=${filename//@(+([a-z])_|_+([a-z]).*)}
echo $substring
12345
해설 (1)

비슷한 substr (& # 39, abcdefg& # 39, 2-1, 3) 의 php.

echo 'abcdefg'|tail -c +2|head -c 3
해설 (1)

배시 (bash) 는 솔루션:


IFS="_" read -r x digs x 
해설 (0)

하지만 이 문제에 대해 좀 많이 늦게 그냥 실행했음 http://support. 다음과 같습니다.

host:/tmp$ asd=someletters_12345_moreleters.ext 
host:/tmp$ echo `expr $asd : '.*_\(.*\)_'`
12345
host:/tmp$ 

나는 그것을 사용할 수 없는 시스템을 %N 임베드된 협력하였습니다 밀리초 해결안에서는 날짜:

set `grep "now at" /proc/timer_list`
nano=$3
fraction=`expr $nano : '.*\(...\)......'`
$debug nano is $nano, fraction is $fraction
해설 (0)

39, & # 39 의 또한 bash 내장 there& expr& # 39. 명령:

INPUT="someletters_12345_moreleters.ext"  
SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `  
echo $SUBSTRING
해설 (2)