この行からの連結文字列を含む行 2 と行 3 の間に行を挿入したい
abc
abcd:
abc
abcd
出力:
abc
abcd:
abcd: abcd
abc
abcd
この行からの連結文字列を含む行 2 と行 3 の間に行を挿入したい
abc
abcd:
abc
abcd
出力:
abc
abcd:
abcd: abcd
abc
abcd
perl -p -i.bck -e "if ($last ne ''){ $_=~s/.*/$last $&\\n$&/; $last=''} elsif (/:/) {$last = $_;chomp($last);} else {$last = '';}" test
test は問題のファイルです
コロンで終わる行の後、または 2 行目の後に何かを追加しますか?
行 2 の後、行split("\n", $string)
の配列を取得し、新しい行を位置 2 の配列にスプライスしてjoin("\n", @array)
から、文字列を取得することができます。
コロンで終わる行の後にある場合は、正規表現を使用できます: s/(:\n)/\1YOUR_NEW_LINE_HERE\n/
.
コロンで終わる各行の後に何を置きたいかを指定しないので、一般的な意思決定とやや柔軟な処理を表す表を作成しました。
# create a table
my %insert_after
= ( abcd => "abcd: abcd\n"
, defg => "defg: hijk\n"
);
# create a list of keys longest first, and then lexicographic
my $regs
= '^('
. join( '|', sort { length $b <=> length $a or $a cmp $b }
keys %insert_after
)
. '):$'
;
my $regex = qr/$regs/;
# process lines.
while ( <> ) {
m/$regex/ and $_ .= $insert_after{ $1 } // '';
print;
}
現在の行の後に行を「挿入」することは、そのテキストを現在の行に追加して出力するのと同じくらい簡単です。