다음과 같은 파일이 주어지면:
a foo 1
b bar 2
c foo 3
d baz 4
e bar 5
파일을 다음과 같이 수정하고 싶습니다. 결과가 다음과 같도록 다음 bar
줄을 포함하는 각 줄을 복사하고 변경합니다.bar
bar2
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
피린트-너노래하다-티터미네이터).
put
Raku는 /print
etc에 명시적인 객체를 제공하도록 요구하여 모호성을 줄입니다 . 따라서 와 같은.put
약어는 수정되지 않은 행이 인쇄된다는 의미입니다.$_.put
put $_
첫 번째 예에서는 수정된 행에 잘 알려진
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