SED在同一行中找到多个路径并将其替换为不同的路径

Posted

技术标签:

【中文标题】SED在同一行中找到多个路径并将其替换为不同的路径【英文标题】:SED find multiple path in same line and replace it multiple with a different path 【发布时间】:2021-07-09 23:39:34 【问题描述】:

我有一个文件在同一行中有多个路径:

cat modules.dep
kernel/mm/zsmalloc.ko:
kernel/crypto/lzo.ko:
kernel/drivers/char/tpm/tpm_vtpm_proxy.ko: kernel/drivers/char/tpm/tpm.ko
kernel/drivers/block/virtio_blk.ko:
kernel/drivers/block/zram/zram.ko: kernel/mm/zsmalloc.ko
kernel/drivers/nvdimm/virtio_pmem.ko: kernel/drivers/nvdimm/nd_virtio.ko
kernel/drivers/nvdimm/nd_virtio.ko:
kernel/drivers/net/virtio_net.ko: kernel/drivers/net/net_failover.ko kernel/net/core/failover.ko
kernel/drivers/net/net_failover.ko: kernel/net/core/failover.ko
extra/virtio_gpu/virtio-gpu.ko: kernel/drivers/virtio/virtio_dma_buf.ko
extra/wlan_simulation/virt_wifi_sim.ko: kernel/drivers/net/wireless/virt_wifi.ko

我想改成:

/lib/modules/zsmalloc.ko:
/lib/modules/lzo.ko:
/lib/modules/tpm_vtpm_proxy.ko: /lib/modules/tpm.ko
/lib/modules/virtio_blk.ko:
/lib/modules/zram.ko: /lib/modules/zsmalloc.ko
/lib/modules/virtio_pmem.ko: /lib/modules/nd_virtio.ko
/lib/modules/nd_virtio.ko:
/lib/modules/virtio_net.ko: /lib/modules/net_failover.ko /lib/modules/failover.ko
/lib/modules/net_failover.ko: /lib/modules/failover.ko
/lib/modules/virtio-gpu.ko: /lib/modules/virtio_dma_buf.ko
/lib/modules/virt_wifi_sim.ko: /lib/modules/virt_wifi.ko

但我的尝试:

sed -i 's/\(.*\)\//\/lib\/modules\//g' modules.load

仅在每行只有一条路径时才有效。

如何通过 SED 实现这一点,每行有多个路径?

我在 D(ASH) Standalone 中使用 BusyBox 中的 SED

BusyBox v1.32.1-Magisk (2021-01-21 00:17:27 PST) multi-call binary.

Usage: sed [-i[SFX]] [-nrE] [-f FILE]... [-e CMD]... [FILE]...
or: sed [-i[SFX]] [-nrE] CMD [FILE]...

    -e CMD  Add CMD to sed commands to be executed
    -f FILE Add FILE contents to sed commands to be executed
    -i[SFX] Edit files in-place (otherwise sends to stdout)
        Optionally back files up, appending SFX
    -n  Suppress automatic printing of pattern space
    -r,-E   Use extended regex syntax

If no -e or -f, the first non-option argument is the sed command string.
Remaining arguments are input files (stdin if none).

提前致谢。

【问题讨论】:

【参考方案1】:

这个sed 应该可以工作:

sed -E 's~[^[:blank:]]+/~/lib/modules/~g' modules.dep

/lib/modules/zsmalloc.ko:
/lib/modules/lzo.ko:
/lib/modules/tpm_vtpm_proxy.ko: /lib/modules/tpm.ko
/lib/modules/virtio_blk.ko:
/lib/modules/zram.ko: /lib/modules/zsmalloc.ko
/lib/modules/virtio_pmem.ko: /lib/modules/nd_virtio.ko
/lib/modules/nd_virtio.ko:
/lib/modules/virtio_net.ko: /lib/modules/net_failover.ko /lib/modules/failover.ko
/lib/modules/net_failover.ko: /lib/modules/failover.ko
/lib/modules/virtio-gpu.ko: /lib/modules/virtio_dma_buf.ko
/lib/modules/virt_wifi_sim.ko: /lib/modules/virt_wifi.ko

[^[:blank:]]+/ 找到 1+ 个非空白字符后跟一个 / 从而匹配最长的字符串,直到它在每行的多个字符串中的每个字符串中都获得一个 /

【讨论】:

是的!它甚至可以与 modules.load 文件一起使用!谢谢!

以上是关于SED在同一行中找到多个路径并将其替换为不同的路径的主要内容,如果未能解决你的问题,请参考以下文章

shell的sed工具,如何删除一个文件中包含了特殊路径字符串的行? 例如文件file,里面有内容,

sed多行模板替换

shell脚本替换A、B两个文件里面的内容

如何用sed中的另一个路径替换路径?

sed命令反斜杠的转义

如何在非二叉树中找到最长路径并将其返回到向量中?