일치하는 줄을 다음 줄에 복사하고 수정하시겠습니까?

일치하는 줄을 다음 줄에 복사하고 수정하시겠습니까?

다음과 같은 파일이 주어지면:

a foo 1
b bar 2
c foo 3
d baz 4
e bar 5

파일을 다음과 같이 수정하고 싶습니다. 결과가 다음과 같도록 다음 bar줄을 포함하는 각 줄을 복사하고 변경합니다.barbar2

a foo 1
b bar 2
b bar2 2
c foo 3
d baz 4
e bar 5
e bar2 5

답변1

Stéphane이 제안한 대로 p줄을 인쇄하고 s바꾸면 sed결과가 자동으로 인쇄됩니다.

sed '/bar/{p;s//&2/;}'  infile

답변2

awk를 사용하십시오.

$ awk '1; sub(/bar/,"&2")' file
a foo 1
b bar 2
b bar2 2
c foo 3
d baz 4
e bar 5
e bar2 5

$ awk '1; sub(/bar/,"hello world")' file
a foo 1
b bar 2
b hello world 2
c foo 3
d baz 4
e bar 5
e hello world 5

이 줄을 인쇄하십시오 (1) 그런 다음 bar원하는 것으로 바꾸려고 시도하고 성공하면( sub()0이 아닌 값을 반환) 지금 수정된 줄을 다시 인쇄합니다.

답변3

사용 awk:

$ awk '/bar/{print; sub(/bar/,"&2")}1'

~처럼대답은 sed보여줍니다, 이 awk명령은 print스키마로 레코드를 기록한 bar다음 sub로 빌드합니다 bar2.

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne '.put; .put if s/bar/bar2/;'  file

또는:

~$ raku -ne '.put; .subst(/bar/, "bar2").put if /bar/;'   file

또는:

~$ raku -ne '.put; /bar/ && .subst(/bar/, "bar2").put;'   file

Raku는 Perl 계열의 프로그래밍 언어입니다. 내장된 유니코드에 대한 고급 지원이 있습니다. 위에서는 데이터를 Raku(및 Perl의) 테마 변수 -ne에 한 줄씩 로드하는 비자동 인쇄 줄별 플래그가 사용되었습니다 . $_Raku는 기본적으로 자동으로 줄을 제거하기 때문에 put(대신 )을 호출 하면 print개행 문자가 추가됩니다.put린트-노래하다-터미네이터).

  • putRaku는 / printetc에 명시적인 객체를 제공하도록 요구하여 모호성을 줄입니다 . 따라서 와 같은 .put약어는 수정되지 않은 행이 인쇄된다는 의미입니다.$_.putput $_

  • 첫 번째 예에서는 수정된 행에 잘 알려진 s///대체 기호가 추가되어 있습니다. ( s:g///여기서는 전역 교체를 위해).

  • 두 번째 예에서는 if검색 일치가 subst발생하고 결과 행이 put다음 행에 나타납니다. 세 번째 예는 &&단락 에 의존한다는 점을 제외하면 두 번째 예와 거의 동일합니다 .

  • Raku에서 일치 항목이 발생하면 일반적으로 일치 항목이 $<>변수에 로드됩니다( 와 동일 $/하지만 읽기 쉽습니다). 그래서 과제는"2를 추가하세요"이는 S/bar/$<>2/또는 더 간단하게 를 사용하여 수행할 수 있습니다 .subst(/bar/, "$<>2");.

입력 예:

a foo 1
b bar 2
c foo 3
d baz 4
e bar 5

예제 출력:

a foo 1
b bar 2
b bar2 2
c foo 3
d baz 4
e bar 5
e bar2 5

특히 복잡한 정규식을 사용하여 작업하는 경우 위의 예는 그다지 건조하지 않습니다. 그러나 추가 사용을 위해 일치 항목을 임시 변수에 저장할 수 있습니다( $a아래와 같이).

~$ raku -ne '.put; if m/complicated_pattern/ -> $a {S/<$a>/replacement/.put};'  file

또는 regex처음부터 -class 변수를 선언하십시오.

~$ raku -ne 'BEGIN my regex RE {complicated_pattern};  \
             .put; .put if s/<RE>/replacement/;  file

#OR

~$ raku -ne 'BEGIN my regex RE {complicated_pattern};  \
             .put; .subst(/<RE>/, "replacement" ).put if /<RE>/;'  file

#OR

~$ raku -ne 'BEGIN my regex RE {complicated_pattern};  \
             .put; /<RE>/ && put .subst(/<RE>/, "replacement" );'  file

https://docs.raku.org/type/Regex
https://raku.org

관련 정보