2012-09-10 2 views
4

어떻게 grep/awk/sed를 사용하여 특정 패턴 (패턴 자체 제외)까지 모든 문자를 인쇄 할 수 있습니까? 예를 들어

echo "abc-1234a :" | grep <do-something> 

은 ABC-1234a에게 내가 이들에 가까운 생각

+5

환영합니다! 이것은 [XY 문제] (http://mywiki.wooledge.org/XyProblem)처럼 들립니다. [당신이 정말로 *하려고하는 것은 무엇입니까?] (http://meta.stackexchange.com/a/66378/174723)? – ghoti

+1

패턴은 무엇입니까? 콜론? 빈 콜론? 당신은 한 줄의 입력만을 다루고 있습니까 (에코처럼), 아니면 여러 줄의 입력을 다루고 있습니까? 그것이 다중 라인 입력이라면, 라인 1..N을 찾고 있습니까? N은 패턴을 포함하는 첫 번째 라인, 나머지는 무시하거나, 각 라인의 초기 세그먼트를 찾고 있습니까? ? –

+0

고마워! 콜론 앞에 입력 한 첫 번째 줄의 문자입니다. 입력은 여러 줄을 가질 수 있습니다. – user1224949

답변

11

를 인쇄하는 당신이에 받고있어,하지만 당신이 정말로 달성하기 위해 노력하고 모르고, 그 말을하기 어렵다 .

echo "abc-1234a :" | egrep -o '^[^:]+' 

...하지만 콜론이없는 행에도 일치합니다. 당신은 단지 콜론 라인을 원하고, 당신이 만 그렙를 사용해야하는 경우,이 작업을 수 있습니다

물론
echo "abc-1234a :" | grep : | egrep -o '^[^:]+' 

, 이것은 단지 의미가 당신의 echo "abc-1234a :"가의 가능성이 여러 줄로 교체 될 예입니다 경우 입력. 당신이 사용할 수

작은 도구는 아마 cut입니다 :

echo "abc-1234a :" | cut -d: -f1 

그리고 sed는 항상 사용할 수 있습니다 ...이 마지막 하나

echo "abc-1234a :" | sed 's/ *:.*//' 

, 당신은 단지 포함 라인을 인쇄하려면 콜론, 다음으로 변경하십시오.

echo "abc-1234a :" | sed -ne 's/ *:.*//p' 

지옥 %% 비트, 당신이 할 수있는 man bash에 대한 자세한 내용은

while read line; do 
    field="${line%%:*}" 
    # do stuff with $field 
done <<<"abc-1234a :" 

을하고 "매개 변수 확장"를 검색 : 순수 배쉬에서이 작업을 수행.

UPDATE는 :

당신은 말했다 :

그것은 콜론 앞 입력의 첫 번째 줄의 문자입니다. 입력은 여러 줄을 가질 수 있습니다. 그들은 또한 콜론을 포함 할 수 있습니다 후속 행에서 데이터를 인쇄 할 것이기 때문에 grep

솔루션은 아마, 다음, 당신의 최선의 선택이 아니다. 물론이 요구 사항을 해결할 수있는 여러 가지 방법이 있습니다.우리는 샘플 입력을 시작합니다 :

$ function sample { printf "abc-1234a:foo\nbar baz:\nNarf\n"; } 
$ sample 
abc-1234a:foo 
bar baz: 
Narf 

당신은 예를 들어 여러 파이프를 사용할 수 있습니다

$ sample | head -1 | grep -Eo '^[^:]*' 
abc-1234a 
$ sample | head -1 | cut -d: -f1  
abc-1234a 

또는 당신은 첫 번째 라인 처리하기 위해 sed를 사용할 수 있습니다

$ sample | sed -ne '1s/:.*//p' 
abc-1234a 

을 또는 sed에게 첫 번째 줄을 인쇄 한 후 종료하도록 명령하십시오 (전체 파일을 읽는 것보다 빠름) :

$ sample | sed 's/:.*//;q' 
abc-1234a 

또는 같은 일을하지만 콜론 (안전을 위해) 발견 된 경우 출력을 보여줍니다 (각각 지난 3 예로)

$ sample | sed -ne 's/:.*//p;q' 
abc-1234a 

또는 AWK 같은 일을 한 :

$ sample | awk '{sub(/:.*/,"")} NR==1' 
abc-1234a 
$ sample | awk 'NR>1{nextfile} {sub(/:.*/,"")} 1' 
abc-1234a 
$ sample | awk 'NR>1{nextfile} sub(/:.*/,"")' 
abc-1234a 
을 전혀 파이프

또는 bash는 :에 StackOverflow에

$ read line < <(sample) 
$ printf '%s\n' "${line%%:*}" 
abc-1234a 
+0

이것은 완벽합니다! 두 번째 옵션은 나를 위해 잘 작동합니다. 나는 입력 첫 줄에 콜론 앞에있는 문자를 원했습니다. 감사! – user1224949

+0

약간의 수정을 권장합니다 :'sed '/ :/{s /:.*//; q;} ''를 사용하는 것이 아니라 입력의 첫 번째 행만 흥미 롭다고 가정합니다. –

+0

@WilliamPursell - OP가 (질문에 대한 의견에서) 입력란의 첫 번째 줄에만 필드 이름을 찾을 것이라고 말했지만 좋은 지적입니다. – ghoti