次の入力から始めてください。
$ 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
。本文の途中でコピーと修正が必要な場合そしてこれを行の先頭に移動し、文字列のすべての部分を一致させてキャプチャグループとしてキャプチャする必要があります。