sedに一致する文字列を追加する

sedに一致する文字列を追加する

次の入力から始めてください。

$ cat file1
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

最初の数値セットを括弧内に入れることができます。

$ sed -En 's/[0-9]*:/(&)/ p'
Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub

しかし、行の前に&(一致する文字列)を追加しようとすると、何も得られません。

$ sed -En 's/[0-9]*:/(&)/ ; s/^/(&)/ p' infile
()Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
()Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub

どうすればいいですか?

ベストアンサー1

&コマンドの代替部分は、s正規表現一致のプレースホルダです。同じsコマンドで

2番目の置換はです。s/^/(&)/これはすべての行の先頭にある空の文字列と一致するため、各行の先頭()にリテラル文字列が挿入されます。角かっこは&空の文字列に置き換えられているため空です。

数字の最初の部分文字列(末尾の数字を含む)を一致させるには、角かっこ内に入れて、角かっこ内の数字を行の先頭に追加してから、コマンドを一度に変更する必要があります:s:

$ sed 's/\(.*Device \)\([0-9]*:\)/(\2)\1(\2)/' file
(001:)Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
(001:)Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub

ここでは、両方のキャプチャグループで、デバイス番号の前の部分と番号とコロンを一致させて収集します。その後、代替テキストの最初のグループの前に2番目のグループ(括弧内)を追加できます。

行の先頭を一致させました。.*Device なぜなら、そのまま使用すると.*前の数字も消費し:、2番目のセットにはコロンだけが含まれるからです。

または、2つの代替を使用します。 1 つ目は数字とコロンを括弧内に入れ、2 つ目は括弧と一致して行の前に追加します。

$ sed -e 's/[0-9]*:/(&)/' -e 's/\(.*\)\((.*)\)/\2\1\2/' file
(001:)Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
(001:)Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub

簡単に言えば、sコマンドは正規表現に一致する文字列部分のみを変更でき、プレースホルダは正規表現に一致する&現在のコマンドのテキストに置き換えられますs。本文の途中でコピーと修正が必要な場合そしてこれを行の先頭に移動し、文字列のすべての部分を一致させてキャプチャグループとしてキャプチャする必要があります。

おすすめ記事