我try 格式化下面的实际输出,以使每个磁盘排在同一行

0. ct1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>
   /pci@4,0/pci8086,347c@4/e,487c@0/disk@1
   /dev/chassis/SYS/DBP/HDD0/NVME/disk
1. c2t1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>
   /pci@4,0/pci8086,347d@5/apci108e,487c@0/disk@1
   /dev/chassis/DBP/HDD1/NVME/disk
2. c3t0d0 <ATA-Min_5300_MAAAD-D3MU-223.57GB>
   /pci@0,0/pci8e,4872@17/disk@0,0
   /dev/chassis/MB/SSDR0/SSD0/disk
3. c4t2d0 <ATA-Min_5300_MTFD-D3MU-223.57GB>
   /pci@0,0/pci08e,4872@17/disk@2,0
   /dev/chassis/SYS/MB/SSDR0/SSD1/disk

try 获得如下所示的预期输出,

0. ct1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>| /pci@4,0/pci8086,347c@4/e,487c@0/disk@1| /dev/chassis/SYS/DBP/HDD0/NVME/disk|
1. c2t1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>| /pci@4,0/pci8086,347d@5/apci108e,487c@0/disk@1| /dev/chassis/DBP/HDD1/NVME/disk|
2. c3t0d0 <ATA-Min_5300_MAAAD-D3MU-223.57GB>| /pci@0,0/pci108e,4872@17/disk@0,0| /dev/chassis/MB/SSDR0/SSD0/disk|
3. c4t2d0 <ATA-Min_5300_MTFD-D3MU-223.57GB>| /pci@0,0/pci108e,4872@17/disk@2,0| /dev/chassis/SYS/MB/SSDR0/SSD1/disk|

我try 了下面的方法,

cat actual_output | tr -s " " | tr "\n" "|"

这导致所有的东西都在一条线上,

0. ct1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>| /pci@4,0/pci8086,347c@4/e,487c@0/disk@1| /dev/chassis/SYS/DBP/HDD0/NVME/disk|1. c2t1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>| /pci@4,0/pci8086,347d@5/apci108e,487c@0/disk@1| /dev/chassis/DBP/HDD1/NVME/disk|2. c3t0d0 <ATA-Micron_5300_MAAAD-D3MU-223.57GB>| /pci@0,0/pci108e,4872@17/disk@0,0| /dev/chassis/MB/SSDR0/SSD0/disk|3. c4t2d0 <ATA-Micron_5300_MTFD-D3MU-223.57GB>| /pci@0,0/pci108e,4872@17/disk@2,0| /dev/chassis/SYS/MB/SSDR0/SSD1/disk|

现在需要替换0.直到下一个1.带换行符(\n)的内容,这样才能得到预期的结果. 我们有没有正则表达式可以做同样的事情?

提亚

推荐答案

将一个数据集修改为只有2行:

$ cat disk.dat
0. ct1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>
   /pci@4,0/pci8086,347c@4/e,487c@0/disk@1
   /dev/chassis/SYS/DBP/HDD0/NVME/disk
1. c2t1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>
   /pci@4,0/pci8086,347d@5/apci108e,487c@0/disk@1
   /dev/chassis/DBP/HDD1/NVME/disk
2. c3t0d0 <ATA-Min_5300_MAAAD-D3MU-223.57GB>
   /pci@0,0/pci8e,4872@17/disk@0,0
3. c4t2d0 <ATA-Min_5300_MTFD-D3MU-223.57GB>
   /pci@0,0/pci08e,4872@17/disk@2,0
   /dev/chassis/SYS/MB/SSDR0/SSD1/disk

扩展OP的当前代码:

cat disk.dat | tr -s " " | tr "\n" "|" | sed -E "s/\|([0-9])/\|\n\1/g; s/$/\n/"

在哪里:

  • sed脚本的前半部分在竖线(|)和数字([0-9])之间放置一个\n
  • sed脚本的后半部分在行尾添加一个\n

另一个awk个 idea :

awk -F'.' '                                        # input field delimiter is a period
           { sub(/[[:space:]]+/,"",$1) }           # remove leading white space from 1st field
($1+0)==$1 { if (NR>1) print ""; pfx="" }          # if 1st field is numeric; if beyond 1st row then terminate previous line of output; reset prefix to empty string
           { printf "%s%s|", pfx, $0; pfx=" " }    # print prefix plus current line; reset prefix to a single space
END        { if (NR>=1) print "" }                 # if we had at least one row of input then terminate previous line of output
' disk.dat

这两种情况都会产生:

0. ct1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>| /pci@4,0/pci8086,347c@4/e,487c@0/disk@1| /dev/chassis/SYS/DBP/HDD0/NVME/disk|
1. c2t1d0 <INTEL-ADDPF2KX076T9S-2CV1-6.19TB>| /pci@4,0/pci8086,347d@5/apci108e,487c@0/disk@1| /dev/chassis/DBP/HDD1/NVME/disk|
2. c3t0d0 <ATA-Min_5300_MAAAD-D3MU-223.57GB>| /pci@0,0/pci8e,4872@17/disk@0,0|
3. c4t2d0 <ATA-Min_5300_MTFD-D3MU-223.57GB>| /pci@0,0/pci08e,4872@17/disk@2,0| /dev/chassis/SYS/MB/SSDR0/SSD1/disk|

Linux相关问答推荐

GO:当使用NewManager调用创建cgroup时,权限被拒绝

为什么我在退出SD-Bus容器时出现错误?

提交SLURM作业(job)时出现nohup问题

Azure Nvidia 中的 apt-update 给出公钥错误

使用带有 gnome-keyring 的 Git 凭证助手作为 Sudo 时出错

我在哪里放置第三方库来设置 C++ Linux 开发环境?

为什么 fork() 在 setsid() 之前

在 Bash 中从最后到第一个输出文件行

Linux 非阻塞 fifo(按需日志(log)记录)

在 C 中设置环境变量

与交换空间相关的链接器性能?

如何让 PHP、Symlinks 和 __FILE__ 很好地协同工作?

如何将 bash 别名定义为多个命令的序列?

将 AWK 结果分配给变量

如何找到只对所有者具有特定权限的文件?

Linux:用户名不在 sudoers 文件中

Android - 找不到命令

将所有文件扩展名转换为小写

构建窗口管理器

适用于 Windows、Linux、MacOS X 的跨平台脚​​本