編集した文字列を含む重複行[閉じる]

編集した文字列を含む重複行[閉じる]

小さな編集文字列を含むファイルから行をコピーする方法を見つける必要があります。レプリカは元の行の上に表示する必要があります。それが最善の選択でしょうかsedawk

理想的には、新しいpuppies行に置き換えて交換することをお勧めします。bunniesIYou

たとえば、

  • 入力ファイル:
    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 }
'

関連情報