2013-09-22 3 views
2

파일 foo.tex\begin{mcstas}\end{mcstas} 사이의 모든 대문자 단어를 인쇄하려면 어떻게해야합니까?sed와 friends가있는 지역의 모든 대문자 단어를 인쇄하는 방법은 무엇입니까?

다음의 예는 foo.tex의 최소한의 예를 포함

\begin{mcstas} 
DEFINE COMPONENT child_name COPY parent_name 
SETTING PARAMETERS (newpar1, newpar2) 
INITIALIZE COPY parent_name EXTEND 
SAVE 
\end{mcstas} 
foo FALSE POSITIVE 
\begin{mcstas} 
DEFINE COMPONENT name ... 
\end{mcstas} 

답변

6

이 조금 까다 롭습니다 부분은 sed 대신 grep으로하는 것이 가장 좋습니다. 당신은 단지 그것을 완수하려는 경우, 당신은 할 수 있습니다 :

다음
$ sed '/\\begin{mcstas}/,/\\end{mcstas}/!d' foo.tex | grep -ow '[A-Z]\+' 
DEFINE 
COMPONENT 
COPY 
SETTING 
PARAMETERS 
INITIALIZE 
COPY 
EXTEND 
SAVE 
DEFINE 
COMPONENT 

가 (당신이 처음 질문으로) 동일을하는 하나의 sed 명령이 보일 것이다 방법은 다음과 같습니다

$ sed -n '/\\begin{mcstas}/,/\\end{mcstas}/!d; s/\b/\n/g; :a; /^[A-Z]\+\n/P; s/[^\n]*\n//; ta' foo.tex 
DEFINE 
COMPONENT 
COPY 
SETTING 
PARAMETERS 
INITIALIZE 
COPY 
EXTEND 
SAVE 
DEFINE 
COMPONENT 
+0

아하, 내가 그 사이에 조각을 만드는 방법을 알고 있다면, 내 대답의 awk 부분을 제거 할 수 있었다! – erewok

+0

@erewok 그들은 동일하게 작동한다고 밝힙니다. –

+0

"대문자 인쇄"부분은 실제로 grep을 요구하지만,이 문제의 다중 행 부분은 다른 곳에서 해결책을 찾는데 영감을주었습니다. 그것은 내가 사용할 수있는 또 다른 도구입니다. – erewok

4

당신은 나오지도 내가 제안하는 (대문자 제외한 모든 것을 대체하기 위해 당신이 원하는 라인과 다음 파이프를 뱉어 AWK를 사용할 수 있습니다 나는 항상 sed를 사용하여 여러 줄을 처리하지 못하기 때문에 awk보다 더 선호한다.

은 아마 더 나은 솔루션있다, 그러나 이것은 나에게 발생한 최초의 하나입니다 끝에 마지막 비트는 단순히 남아있는 빈 줄을 삭제

awk '/begin/,/end/' yourfile.txt | sed 's/[^A-Z ]//g' | sed '/^$/d' 

있다.

이 다음과 같은 출력을 생성합니다 : (가) "\begin{mcstas}\end{mcstas} 사이"부분은 sed 쉽게 할 수있는 일이지만, "모두 대문자 단어를 인쇄"당신이 그것을 요구로

DEFINE COMPONENT COPY 
SETTING PARAMETERS 
INITIALIZE COPY EXTEND 
SAVE 
DEFINE COMPONENT 
2

혼자 사용 :

한 라이너 버전 :

perl -lne '/\\begin\{mcstas\}/../\\end\{mcstas\}/ and /\p{Lu}+/ and print $& for split;' file 

확장 버전 :

perl -lne ' 
    if (/\\begin\{mcstas\}/ .. /\\end\{mcstas\}/) { 
     /\p{Lu}+/ and print $& for split; 
    } 
' file 

우리는 POSIX [[:upper:]]를 사용할 수도 대신 \p{Lu} 또는

\p{Uppercase_Letter}이 P {} \ http://perldoc.perl.org/perluniprops.html#Properties-accessible-through-를 참조 - 앤 \의 P {}

+1

범위 연산자를 사용하는 것이 더 자연 스럽습니다 :'{/ \\ begin \ {mcstas \}/../\\ end {{mcstas}}) {{}}' –

1
$ awk -v RS='[[:space:]]' '/\\(begin|end){mcstas}/{f=!f} f && /^[[:upper:]]+$/' file 
DEFINE 
COMPONENT 
COPY 
SETTING 
PARAMETERS 
INITIALIZE 
COPY 
EXTEND 
SAVE 
DEFINE 
COMPONENT 

또는 당신이 원하는 경우에 그들 만 인쇄 한 번 :

$ awk -v RS='[[:space:]]' '/\\(begin|end){mcstas}/{f=!f} f && /^[[:upper:]]+$/ && !seen[$0]++' file 
DEFINE 
COMPONENT 
COPY 
SETTING 
PARAMETERS 
INITIALIZE 
EXTEND 
SAVE 
1

또 다른 awk :

awk '/\\end/{f=0} toupper($0)==$0 && NF; /\\begin/{f=1}' RS=" |\n" file 
관련 문제