문자열을 문자열 자체의 일부로 바꾸기

문자열을 문자열 자체의 일부로 바꾸기

텍스트 파일에 저장된 데이터를 정리하고 있습니다. 각 줄은 카테고리 레이블로 시작하고 그 뒤에 정리하려는 실제 데이터가 옵니다. 여러 하위 폴더에 많은 텍스트 파일이 있으므로 일반적으로 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.thetheater

답변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

관련 정보