sed: 처음 x 발생에 텍스트를 추가하는 방법

sed: 처음 x 발생에 텍스트를 추가하는 방법

줄의 처음 x번째 항목 끝에 텍스트를 추가하려고 합니다. 나는 이것을 전역적으로 그리고 n 번째 발생에서 수행하는 방법을 알고 있습니다. 처음 n번 발생하는 경우 이 작업을 수행하는 방법을 모르겠습니다. 예는 다음 내용을 포함하는 text.txt 파일입니다.

This is a test
junk
This is a test
More junk
This is a test
This is a test
This is a test

또한 처음 세 번 "this is a test"가 나타나면 끝에 "."를 추가하고 싶습니다. 내가 얻고 싶은 결과는 다음과 같습니다.

This is a test.
junk
This is a test.
More junk
This is a test.
This is a test
This is a test

답변1

This.*test올바른 정규식입니다. 별표는 "이전 문자의 0번 이상"을 의미하므로 This*test어떤 줄과도 일치하지 않습니다.

이제 Sed는 산수를 잘하지 못합니다. 우아한 것을 원한다면 Awk를 추천합니다:

awk '/This.*test/{c++};{print $0 (c<4 ? "." : "")}' file

Awk의 설정되지 않은 변수와 마찬가지로 0으로 처리된다고 말하면 충분하다고 생각합니다 c. 하지만 추가 설명이 필요하면 알려주시기 바랍니다.

답변2

3개의 일치 항목이 모두 발견된 후 정규식 일치를 수행하지 않는 또 다른 변형:

awk -v n=3 'n && /This is a test/ {n--; $0 = $0 "."}; {print}'

구체적으로 sed다음을 수행할 수 있습니다.

sed '
  1 {
    x
    s/^/.../
    x
  }
  /This is a test/ {
    s/$/./
    x
    s/.//
    /./ {
      x
      b
    }
    g
    :1
    $! {
      n
      b 1
    }
  }'

.예약된 공간에 해당 개수 만큼 추가할 개수를 추적합니다 ..

말할 필요도 없이 이는 sed이러한 유형의 작업에는 적합하지 않습니다. 원하는 이유가 일부 구현에서 내부 편집(빌려온)을 위한 확장을 찾는 sed것이라면 GNU 구현은 1을 사용하여 구현할 수도 있고 실제를 사용할 수도 있다는 점에 유의하세요.-iperlawk-i /usr/share/awk/inplace.awk

perl -lpi -e '
  if ($n < 3 && /This is a test/) {
    $n++;
    $_ .= ".";
  }' your-file

적어도 하나의 항목을 포함하는 모든 줄 뒤에 추가하는 것이 아니라 .각 항목 뒤에 추가 하려는 경우에도 이것이 가장 좋은 옵션입니다 .This is a testThis is a testperl

perl -pi -e 's{This is a test\K}{$n++ < 3 ? "." : ""}ge' your-file

^사용하지 마세요-i inplace현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

답변3

perl그림과 같이 하면 됩니다

perl -lpe '
  $_ = $k == 3 ? next : s/This is a test(?{$k++}).*\K/./r;
' file

단계는 간단하지만 코끼리도 춤을 춥니다. GNU sed확장 정규식 모드에서 쓰기를 사용하면 -E 보류 항목의 개행 수로 개수를 저장할 수 있습니다.

K=3
sed -Ee '
  /This is a test/!b
  G
  /(.*\n){'"$K"'}.*\n/!{
    s/\n+/./p;z;H;d
  }
  s/\n+//
  :a;n;ba
' file

관련 정보