텍스트 파일에 저장된 데이터를 정리하고 있습니다. 각 줄은 카테고리 레이블로 시작하고 그 뒤에 정리하려는 실제 데이터가 옵니다. 여러 하위 폴더에 많은 텍스트 파일이 있으므로 일반적으로 egrep
파일 이름을 sed
.
CON: the Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: The holy seat
TTITLE: As we go, the Kuckuck comes too
이제 I로 시작하는 모든 줄에서 다음 내용이 (SEM|AFF|CON)
대체됩니다. 즉, 데이터는 나중에 다음과 같아야 합니다.(T|t)he[ ]*
(:|\,)
CON: Unix and Linux question
SEM: eins, zwei, drei
AUTH: , the
AFF: holy seat
TTITLE: As we go, the Kuckuck comes too
지금까지 나는 두 단계, 즉 :
- 부분과 ,
- 부분을 통해 이를 달성하려고 노력했습니다. 하지만 저는 첫발을 내디뎠습니다.
첫 번째 부분
파일을 인식하는 명령/모드 egrep -rl ^"(SEM|CON|AFF)\: (t|T)he"
는 예상대로 작동합니다.
이제 내가 할 때
egrep -rl ^"(SEM|CON|AFF)\: (t|T)he" | xargs sed -i 's/\((SEM|CON|AFF)\: \)(t|T)he[ ]*/\1/g'
아무 일도하지. 내 sed
부분이 잘못된 걸까? 을(를) 역 ((SEM|CON|AFF)\:
참조 할 수 없나요 \1
?
두 번째 부분
파일을 인식하는 명령/모드는 입니다 egrep -rl ^"(SEM|CON|AFF)\:.*\,[ ]*(t|T)he"
. 이 역시 예상대로 작동합니다. 하지만 sed
지금까지 시도한 모든 조합은 콘텐츠를 제거합니다.
답변1
나는 다음을 사용합니다 :
sed -r '/(SEM|AFF|CON)/ s/([:,] *)[Tt]he */\1/g' file
-i
파일을 제자리에서 변경하는 옵션이 추가되었습니다 .
답변2
sed 표현식을 사용하세요(GNU sed 필요):
sed -r -i -e '/(SEM|AFF|CON)/s/([:,]\s*)the\s+/\1/ig' *
sed 명령 시작 부분의 검색 패턴은 선택한 범주로 시작하는 행으로 대체를 제한합니다. i
바꾸기 명령( )의 플래그는 s//
패턴에서 대소문자를 구분하지 않도록 합니다. 이 g
플래그는 한 줄에서 여러 대체를 허용합니다. \s
공백(공백, 탭)을 나타냅니다.
sed
플래그와 함께 확장 정규식을 사용하십시오 -r
. 예를 들어 GNU sed는 이를 지원합니다. 이 -i
플래그를 사용하면 내부 편집이 가능해집니다. 쉘은 *
현재 디렉토리의 모든 파일로 확장됩니다.
이 패턴은 그 뒤에 최소한 하나의 공백이나 탭이 있도록 하여 like로 시작하는 단어가 대체되지 않도록 합니다 the
.the
theater
답변3
다음 방법을 시도해 보세요.
egrep -rl "^(SEM|CON|AFF)\: (t|T)he" * | xargs sed -r -i 's/(^(SEM|CON|AFF):\s)((t|T)he[ ]*)/\1/g'
답변4
사용행복하다(이전 Perl_6)
~$ raku -pe 's/^ [SEM|AFF|CON] <+[:,]> \s <( [T|t] he \s+ //;' file
입력 예:
CON: the Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: The holy seat
TTITLE: As we go, the Kuckuck comes too
예제 출력:
CON: Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: holy seat
TTITLE: As we go, the Kuckuck comes too
기본적으로 코드를 이해하고 구현하면 이 문제를 쉽게 해결할 수 있습니다.캡쳐마크. 라쿠에서는 캡쳐마크 기호 가 <(
.... )>
두 캡처 태그를 모두 사용할 필요는 없습니다.
캡처 태그의 기능은 무엇인가요? 위의 대체 연산자 인식 부분에서 s///
모든 요소가 인식됩니다.
^ [SEM|AFF|CON] <+[:,]> \s <( [T|t] he \s+
그러나 캡처 태그로 인해 오른쪽에 있는 모든 항목만 <(
"캡처된" 상태로 유지됩니다. 즉:
<( [T|t] he \s+
이제 더 큰 시퀀스를 식별하고 "capture"의 하위 시퀀스를 유지했으므로 "capture"를 빈 것으로 대체하여 원하는 결과를 얻습니다. 참고: 위 코드의 최종 정규식 원자는 \s+
가 아니라 입니다 \s*
. 이는 The
"상대성 이론"과 같은 제목에서 제거되는 것을 방지합니다.
https://docs.raku.org/언어/regexes#Capture_markers:_%3C(_)%3E
https://docs.raku.org/언어/regexes
https://raku.org