次の構造のファイルがあります。
4168 Targus
1010 Wireless Compact Laser Mouse
4242 USB Design by Example
4201 Buttons and Lights HID device
4220 Echo 1 Camera
4255 GoPro
1000 9FF2 [Digital Photo Display]
2000 HD2-14 [Hero 2 Camera]
4317 Broadcom Corp.
0700 U.S. Robotics USR5426 802.11g Adapter
0701 U.S. Robotics USR5425 Wireless MAXg Adapter
0711 Belkin F5D7051 v3000 802.11g
0720 Dynex DX-BUSB
0721 Dynex DX-EBUSB
4348 WinChipHead
5523 USB->RS 232 adapter with Prolific PL 2303 chipset
5537 13.56Mhz RFID Card Reader and Writer
5584 CH34x printer adapter cable
4572 Shuttle, Inc.
4572 Shuttle PN31 Remote
ここで、各部分は空白ではなく文字で区切られます。ファイルの各セクションの先頭文字と行番号がわかりません。
BashまたはPython 3で2つの部分の間の行を読み取るには?
上記の例では、最初の部分は行4168で、次の行の前の行までです(空白ではなく文字で始まります)。最初の部分には次の行があります。
1010 Wireless Compact Laser Mouse
2番目の部分には以下が含まれます。
4201 Buttons and Lights HID device
4220 Echo 1 Camera
与えられた入力で部分選択が行われる。例えば4242入力してください。読むべき部分は次のとおりです。
4201 Buttons and Lights HID device
4220 Echo 1 Camera
行番号がわからないことに注意してください。4242。
ベストアンサー1
num=4242
sed -n '
/^'"$num"'\b/,/^[^[:blank:]]/{
/^[[:blank:]]/ {s/^[[:blank:]]*//;p}
}' data_file
GNU 4.7でテストされましたsed
。
変数が展開されると、コード4242
に表示されます。sed
先頭にある完全な単語(差別化など)である行から先行スペース(タブまたはスペース)を含まない最初の行までの範囲を定義します/^4242\b/,/^[^[:blank:]]/
。4242
42421
範囲内で、スペース/^[[:blank:]]/
()で始まる行の先頭のスペースが削除され(s/^[[:blank:]]*//
)印刷されます(p
)。
メモ:
- 複数の部品が認識されると、
4242
その行が他の部品に属することを示すことなく、すべての部品から行を取得します。 (num=…; sed …)
現在のシェルで変数を設定(または変更)したくない場合は、サブシェル()でコードを実行してください。num