文字列に一致する行全体をコピーしてプレフィックスで貼り付ける方法は?

文字列に一致する行全体をコピーしてプレフィックスで貼り付ける方法は?

コマンドを使用してファイル内の特定の行を検索しようとしていますが、正常に実行していますgrep

今度は、行全体を元の行の後の新しい行にコピーしたいと思います。つまり、元の行の後には内容は同じですが、いくつかのプレフィックスが付いた新しい行が来なければなりません。

例: 生データ:

Apple 
Samsung
Nokia
HTC

新しいデータが次のように見えるようにしたいとします。

Apple
Samsung
prefix Samsung
Nokia
HTC

注:複数のモードがあり、Samsung同じことを行う必要があることがわかりました。

grep配管しようとしましたがsed失敗しました。誰でもこの問題を解決するのに役立ちますか?

ありがとう

答え1

を使用してこれを行うことができますawk

ここであなたの例を使用することは一つのアプローチです。

awk '{print $0} /Samsung/ {print "prefix " $0}' filename

この文を分析すると、次のようになります。 {print $0}行全体を印刷します。

/Samsung/ {print "prefix " $0}行全体に続く「プレフィックス」印刷を表します。ただし、行にSamsungが含まれている場合にのみ適用されます。

答え2

sed -n 'p;s/^Samsung$/prefix &/p' file >newfile

まず、現在のラインを出力します。その後、文字列をスペースと一致する文字列(代替文字列で拡張された内容)Samsungに置き換えて、各行の前に文字列を効果的に挿入します。交換が成功すると、変更された行が印刷され、出力に新しい行が追加されます。prefix&prefixSamsungSamsung

これにより、出力が新しいファイルに書き込まれますnewfile

Samsung行内の任意の位置に一致するように文字列の一致を軽減するには、たとえば、次のようにします。

sed -n 'p;s/.*Samsung/prefix &/p' file >newfile

上記の使用awkと同等の結果を得るには、次の手順を実行します。

awk '1; /^Samsung$/ { print "prefix", $0 }' file >newfile

lone は と同様に現在行を出力する1ショートカットキーです。{ print }{ print $0 }

行が対応する文字列である必要があるのではなく、行の任意の/Samsung/場所で文字列を一致させるには、justを使用してください。Samsung

上記のコマンドの難読化された変形awk

awk '1; /^Samsung$/ && $0 = "prefix " $0' file >newfile

答え3

これはGNUを使ったソリューションですsed。文字列「Samsung」を見つけて自分の文字列に置き換え、「Samsung」パターンに一致する新しい行を追加し、先頭に「プレフィックス」を追加します。

# doubled the example data to show it works on every line
$ sed 's/^Samsung$/&\nprefix &/' file
Apple 
Samsung
prefix Samsung
Nokia
HTC
Apple 
Samsung
prefix Samsung
Nokia
HTC

答え4

「予約済みスペース」を使用する別のsed実装

sed '/Samsung/ {h; s/^/prefix /; H; g;}' file

引用:https://www.gnu.org/software/sed/manual/html_node/Other-Commands.html

関連情報