2010-01-27 6 views
1

처음 sed'er이므로 부드럽게하십시오.sed regex 도움말 : 특정 태그에서 텍스트 추출

I가 다음과 같은 텍스트 파일, 'test_file'

<Tag1>not </Tag1><Tag2>working</Tag2> 

내가 나오지도 정규식을 사용하여 <Tag2> 사이에서 텍스트를 추출 할 수있다 <Tag2>의 다른 발생 될 수 있으며, 나 또한 사람들을 추출하고자합니다 .

지금까지이 나오지 기반 정규 표현식이 있습니다

not working 

사람은 어떻게 작업을 진행하는 어떤 생각 : 출력을 제공

cat test_file | grep -i "Tag2"| sed 's/<[^>]*[>]//g' 

를?

+0

당신이 쓴 무엇을, 당신 만 TAG2 태그 사이의 텍스트를 필요로 추측 오전. 그 맞습니까? 그렇다면 고양이가 무엇인지 알아? test_file | grep -i "Tag2"출력? –

+1

http : // stackoverflow를 참조하십시오.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – bmargulies

+2

죄송하지만, 더 이상 제공하지 않고 regex + (x) html 관련 질문에 대한 반응으로 * * 링크를 게시하고 있습니다. 정보는 질문 자체만큼이나 지루합니다. 생각 해보니 더욱 그렇습니다. 악명 높은 인용문 "프로그래머 * bla bla bla * problem * couch * regex * gulp *에 두 가지 문제점이 있습니다!"를 게시하는 것과 같습니다. " 링크를 게시 할 수 없다는 압박감을 느낀다면 원래 포스터에게 가장 좋은 해결책이 아님을 나타내는 약간의 표시를 제공하십시오. –

답변

4

다른 포스터가 말했듯이, sed는이 작업을위한 최고의 도구가 아닐 수도 있습니다. XML 구문 분석 용으로 만들어진 것 또는 perl과 같은 간단한 스크립팅 언어를 사용할 수도 있습니다.

시도 할 때 문제는 문자열을 올바르게 분석하지 않는다는 것입니다.

cat test_file - 파일의 내용을 표준 출력으로 출력합니다.

grep -i "Tag2"은 "태그 2"가있는 줄만 인쇄합니다. 이것은 정확히 원하는 것일 수 없습니다. 전체 줄은 태그 2 > 부분이 아닌 줄로 인쇄되므로 나중에 해당 부분을 검색해야합니다.

sed 's/&lt;[^&gt;]*[&gt;]//g' 당신이 원하는 것이 아니다 - 그것은 단순히 <TAG1> <TAG2>를 포함하여 태그를 제거합니다. 이

working 

를 생성합니다

cat tmp.tmp | grep -i tag2 | sed 's/.*<Tag2>\(.*\)<\/Tag2>.*/\1/' 

하지만 그것은 단지 하나의 태그 쌍에 대해 작동합니다

당신은 뭔가를 시도 할 수 있습니다.

당신의 좋은, 쉬운 예를 들어
+1

+1 ** ** 게시 * 링크를 게시하지 않고 인내심있게 질문에 답하는 것은 물론 문제에 대한 일반적인 해결책이 아님을 경고합니다. –

4

, 당신은

sed -e 's/^.*<Tag2>//' -e 's!</Tag2>.*!!' test-file 

하지만 XML 잔인하고 무관 심한 거기에서 사용할 수 있습니다. 정규 표현식을 사용하여 XML을 다듬는 데 심각한 문제가 있는지 묻습니다. 당신이 둔한를 사용할 수 있습니다

+3

+1 ** ** 게시 * 링크를 게시하지 않고 인내심있게 질문에 답하는 것은 물론 문제에 대한 일반적인 해결책이 아님을 경고합니다. –

0

, 예를 들어

$ cat file 
<Tag1>not </Tag1><Tag2>working here</Tag2> 
<Tag1>not </Tag1><Tag2> 
working 

</Tag2> 

$ awk -vRS="</Tag2>" '/<Tag2>/{gsub(/.*<Tag2>/,"");print}' file 
working here 

working 
0
awk -F"Tag2" '{print $2}' test_1 | sed 's/[^a-zA-Z]//g'