コマンドを使用してファイル内の特定の行を検索しようとしていますが、正常に実行しています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
&
prefix
Samsung
Samsung
これにより、出力が新しいファイルに書き込まれます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