小さな編集文字列を含むファイルから行をコピーする方法を見つける必要があります。レプリカは元の行の上に表示する必要があります。それが最善の選択でしょうかsed
?awk
理想的には、新しいpuppies
行に置き換えて交換することをお勧めします。bunnies
I
You
たとえば、
- 入力ファイル:
I have puppies cute I have two kitties I have three puppies cute I have four kitties
- 結果は次のとおりです。
You have bunnies cute I have puppies cute I have two kitties You have three bunnies cute I have three puppies cute I have four kitties
答え1
GNUの使用sed
:
sed 'h; s/puppies/bunnies/g; T; s/I/You/; G' < your-file
答え2
を使用しsed
、トリガーが行末cute
の部分文字列であるとします。
sed '/cute[[:blank:]]*$/ { h; s/^I/You/; s/[[:alpha:]]* cute/bunnies cute/; G; }' file
パターン[[:blank:]]*
には末尾のスペースまたは行末のタブが許可されます(質問の最初の行には末尾のスペースがあります)。
これによりテキストが生成されます。
You have bunnies cute
I have puppies cute
I have two kitties
You have three bunnies cute
I have three puppies cute
I have four kitties
このh
コマンドは、「予約済みスペース」に現在行のコピーを保存します。最初のs///
コマンドはI
で始まる行を変更し、2番目のコマンドはYou
で始まるすべてのcute
単語を変更しますbunnies
。このG
コマンドは、予約済みスペースの元の行を現在の(変更された)行の最後まで追加し、その間に改行を追加します。
変形:
sed '/[[:alpha:]]* \(cute[[:blank:]]*\)$/ { h; s//bunnies \1/; s/^I/You/; G; }' file
これは、コマンドで正規表現を空白にすると、最新のs///
正規表現が使用されるという事実を利用します。
puppies
代わりに文字列によってトリガーされるバリアントですcute
。これにより、長さがやや短くなります。
sed '/puppies/ { h; s//bunnies/; s/^I/You/; G; }' file
答え3
使用awk
:
awk 'function prnt() { print edit ORS hold; hold=edit="" }
hold { prnt() }
/puppies/ { hold=$0; $1="you"; gsub("puppies", "bunnies"); edit=$0; next }
END{ if(hold) prnt() }1' infile
答え4
gnu sed
そしてbranches
:
sed '
s/puppies/&/g; tfind
n
:find
h
s/puppies/bunnies/g
s/^I/You/
G
'
gawk
:
awk '$0~/puppies/ {
original=$0
sub(/puppies/, "bunnies")
sub(/^I/, "You")
print $0, original
next
}
{ print }
'