2013-08-19 1 views
1

bash를 사용하여 파일에서 번호를 수집하려고합니다. 내 파일은 다음과 같습니다 :bash에서 보이지 않는 0131 번호

number = 123; 

내가 그걸 얻기 위해 명령을 다음 사용

grep number file.txt | tr -dc 0-9 

을 그리고 내가 얻을 것은 :

0131123 

나는 다른 번호와 다른 방법 sed 's/[^0-9]//g'을 시도했지만 항상 결과 0131 + my_number를 제공합니다. 이유가 무엇입니까?

UPDATE

귀하의 질문에 한 줄을 제외하고 아무것도 포함하지 않는 파일을 볼 수 있듯이

[email protected]:/tmp$ grep number file.txt 
number = 123; 
[email protected]:/tmp$ grep number file.txt | tr -dc 0-9 
[email protected]:/tmp$ 
[email protected]:/tmp$ grep number file.txt | sed 's/[^0-9]//g' 
0131123 
[email protected]:/tmp$ cat file.txt 
number = 123; 

에 대한 답변을주기.

업데이트 2 개

antak에 의해 주어진 명령의 결과 및 Gordon Davisson

[email protected]:/tmp$ grep number file.txt | cat -v 
^[[01;31m^[[Knumber^[[m^[[K = 123; 
[email protected]:/tmp$ hexdump -C file.txt 
00000000 6e 75 6d 62 65 72 20 3d 20 31 32 33 3b 0a  |number = 123;.| 
0000000e 

cat -v 후 나는 0131 매직 볼 수 있습니다,하지만 난 그것을에서 오는 아무 생각이 없습니다.

+2

합니까에 대한 최대 - 투표를받을 자격이 생각''number'를 포함하는 다른 라인을 가지고 file.txt'? – fedorqui

+0

아니요. 번호는이 파일에서 고유합니다. – nervosol

+2

내가 이것을 시도 할 때, 나는 예상대로 '123'을 얻는다. 왜이 문제가 발생하는지 모르겠다 ... 나는 '0131'접두어가 스크립트의 다른 부분에 의해 생성 된 것으로 의심된다. – roky

답변

2

당신은 sed 사용할 수 있습니다

grep number file.txt | cut -d' ' -f3 | tr -d ';' 

또는 (당신이 제안) :

grep number file.txt | tr -dc 0-9 

업데이트 :

sed -n 's/number = \(.*\);/\1/p' file.txt 

또는 그렙 친구들과

나는 시도하지 않았다 원래 대답을하기 전에 당신의 예를

#!/bin/bash 
FILENAME='file.txt' 
SEARCH_PATTERN='number' 

foundLine=$(grep -m 1 "$SEARCH_PATTERN" "$FILENAME") 
if [[ $foundLine =~ =.*\; ]]; then 
    value=$BASH_REMATCH 
    value=$(echo "${value:1:-1}" | xargs) # remove = and ; and then trim 
    echo "Your value is: _${value}_" 
else 
    echo 'Line not found :(' 
fi 

이 매우 유용하기 때문에 켜져 : 그냥 (위 참조)

다음
+0

또한'grep'과 함께이 파일도 작동합니다 :'grep -Po '(? <=) \ d +'file'. – fedorqui

+1

@fedorqui 좋은 사람! :) – hek2mgl

+0

@fedorqui 아니요 대부분의 greps에서는 펄 정규 표현식이 아니기 때문에 그렇지 않습니다. – Jens

0

뿐만 아니라 번호와 다른 데이터와 작동하는 더 일반적인 솔루션입니다 .. 당신의 예는 나를 위해 일한 것을 말하고 싶었다 이 내용을 가진 파일 :

number  =  'complex thing :3' ; # my comment with numbers 123 512 
number = 'sadfhsah'; 

그것이

Your value is: _complex thing :3_ 

을 반환해야합니다 그래서 그것은 전혀하지 않습니다 댓글 및 기타 쓰레기의 숫자에 의존합니다.

P. 그 안에 개행 문자가있는 변수와 ';'가 포함 된 주석은 작동하지 않습니다. 문자

1

귀하의 grep --colour=always 설정입니다. 설정이 완료되면 기본적으로 일치하는 부분 문자열의 색이 붉은 색으로 변하고 (here 참조), ^[[01;31m^[[K....^[[m^[[K 태그로 저장됩니다 ...일치하는 하위 문자열입니다. --colour 옵션을 끄거나 --colour=auto을 사용하도록 변경하면 문제가 해결됩니다.

가 BTW, 내가 대답 :

+0

왜 색상? 나는 원래의 질문에서 색을 언급하는 것을 보지 못했다. – Kmeixner

+0

왜냐하면 기본적으로'GREP_COLOR'는 일치하는 부분 문자열에 대해'mt = 1; 31' (굵은 붉은 색)로 설정되기 때문입니다 (자세한 내용은 here [http://www.gnu.org/software/grep/manual /html_node/Environment-Variables.html)). 나는 원래 포스터가'grep --color = always'를 설정하여 grep 출력의 색상 코드를 숨길 수 있다고 생각합니다 (빨간색으로 표시되지만'^ [[01; 31m^[[Knumber^[[m^[그의 케이스에서는'cat -v'를 통해 [K]가됩니다.) – Xianjun

+0

업보/투표에 대한 구걸이 나쁜 형태입니다. (당신은 _do_ 내 upvote, 그래도 좋은 답변입니다). –