문단을 복사하고, 사용자를 변경하고, 같은 파일에 삽입할 수 있는 것을 찾고 있습니다.
이전 파일:
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