변경된 문자열을 사용하여 단락을 복사하는 방법

변경된 문자열을 사용하여 단락을 복사하는 방법

문단을 복사하고, 사용자를 변경하고, 같은 파일에 삽입할 수 있는 것을 찾고 있습니다.

이전 파일:

user1
  this is only
  a test of 
  a lovely idea

user2
  this user shhould
  be copied

user3
  who has an
  idea for
  my problem

그 이후의 파일( user2다음으로 검색, 복사 및 삽입 user4):

user1
  this is only
  a test of 
  a lovely idea

user2
  this user shhould
  be copied

user3
  who has an
  idea for
  my problem

user4
  this user shhould
  be copied

답변1

#!/bin/perl
#
use strict;

local $/="\n\n";

my $match = shift @ARGV;
my $subst = shift @ARGV;
my $save;

while (defined (my $paragraph = <>))
{
    $paragraph =~ s/\n+$//;
    $paragraph .= "\n";

    my $user = ($paragraph =~ m/(\w+)\n/)[0];
    if ($match eq $user)
    {
        $save = $paragraph;
        $save =~ s/\b$user\b/$subst/g
    };

    print "$paragraph\n"
}
print "$save" if defined $save;
exit 0

이렇게 사용하세요

script.pl user2 user4 <file

답변2

해결책은 다음과 같습니다.TxR:

@(collect)
@name
@  (collect)
@line
@  (last)

@  (end)
@  (maybe)
@    (bind name @[*args* 1])
@    (bind cname @[*args* 2])
@    (bind cline line)
@  (end)
@(end)
@(merge name name cname)
@(merge line line cline)
@(output)
@  (repeat)
@name
@    (repeat)
@line
@    (end)

@  (end)
@(end)

달리기:

$ txr insert.txr data user2 user4
user1
  this is only
  a test of
  a lovely idea

user2
  this user shhould
  be copied

user3
  who has an
  idea for
  my problem

user4
  this user shhould
  be copied

awk 상태 머신:

BEGIN       { split(ed,kv,","); }
1
$0 ~ kv[1]  { copy = 1; next }
copy        { lines = lines ? lines "\n" $0 : $0 }
/^$/        { if (copy) have = 1; copy = 0; }
END         { if (have) { print ""; print kv[2] ; print lines } }

실행(이전과 같이 출력):

$ awk -f insert.awk -v ed=user2,user4 data
user1
  this is only
  a test of
  a lovely idea

user2
  this user shhould
  be copied

user3
  who has an
  idea for
  my problem

user4
  this user shhould
  be copied

TXR Awk, 동등한 논리. 행은 문자열이 아닌 실제 목록 데이터 구조에 누적됩니다. 목록은 부울 역할을 하며 비어 있지 않은 경우 true를 나타내므로 해당 플래그가 필요하지 않습니다 have. 데이터 파일 뒤의 나머지 매개변수에 직접 액세스할 수 있습니다.

(awk
  (:inputs [*args* 0])
  (:let lines copy)
  (t)
  ((equal rec [*args* 1]) (set copy t) (next))
  (copy (push rec lines))
  ((equal rec "") (set copy nil))
  (:end (when lines
          (put-line) (put-line [*args* 2]) (tprint (nreverse lines)))))

실행(이전과 같이 출력):

$ txr insert.tl data user2 user4

관련 정보