格式化文本并在特定模式之间添加文本部分

Formatting text and adding text-part between specific pattern

在 GNU/Linux 上,我通过 运行 ls 命令跟踪输出:

$ ls -l /dev/disk/by-label/
total 0
lrwxrwxrwx 1 root root 10 Mar  4 18:21 Documents+Edu -> ../../sda4
lrwxrwxrwx 1 root root 10 Mar  4 18:17 Ext4 -> ../../sda3
lrwxrwxrwx 1 root root 10 Mar  4 18:21 Game+Movie -> ../../sda6
lrwxrwxrwx 1 root root 10 Mar  4 18:42 OS -> ../../sda7
lrwxrwxrwx 1 root root 10 Mar  4 18:20 Software+Video -> ../../sda5

我想要以下输出:

sudo mount /dev/sda4 /media/$USER/Documents+Edu
sudo mount /dev/sda3 /media/$USER/Ext4
sudo mount /dev/sda6 /media/$USER/Game+Movie
sudo mount /dev/sda7 /media/$USER/OS
sudo mount /dev/sda5 /media/$USER/Software+Video

换句话说:-

如何使用 grepcutawksed 等命令在 Linux 上获得所需的输出?

由于除了名称及其符号链接之外您不需要任何其他内容,所以我最好只执行 ls -1(一个而不是 L),而只是获取最后一列。然后,管道到这个 awk:

awk -F"->|/" '{printf "sudo mount /dev/%s /media/$USER/%s\n", $NF, }'

它将文本分割成 ->/ 分隔符。基于此,它获取最后一个和第一个并相应地填充字符串。

测试

$ ls -1 /dev/disk/by-label/ | awk -F"->|/" '{printf "sudo mount /dev/%s /media/$USER/%s\n", $NF, }'
sudo mount /dev/sda4 /media/$USER/Documents+Edu 
sudo mount /dev/sda3 /media/$USER/Ext4 
sudo mount /dev/sda6 /media/$USER/Game+Movie 
sudo mount /dev/sda7 /media/$USER/OS 
sudo mount /dev/sda5 /media/$USER/Software+Video 

另一种选择是避免 ls 使用 readlink:

完全迭代文件
$ cat ../nols.sh
cd /dev/disk/by-label
for f in *
do
    v=$(basename $(readlink $f))
    echo "sudo mount /dev/$v /media/$USER/$f"
done


$ sh ../nols.sh
sudo mount /dev/sda4 /media/$USER/Documents+Edu
sudo mount /dev/sda3 /media/$USER/Ext4
sudo mount /dev/sda6 /media/$USER/Game+Movie
sudo mount /dev/sda7 /media/$USER/OS
sudo mount /dev/sda5 /media/$USER/Software+Video
# -- Prepare ---
Folder='/dev/disk/by-label/'
HeaderLen=$(ls -ld . | wc -c )

# -- execute ---
ls -l "${Folder}" | sed "1d;s#.\{${HeaderLen}\}\(.*\) -> .*\(/[^/]*\)#sudo mount /dev /media/$USER/#;t;d"
  • 估计未使用的 ls 的第一部分(并将被删除)
  • 列出到 sed 的文件夹管道
  • 删除第一行(总信息)
  • 删除第一部分并采用 -> 分隔的 2 组文本,以新格式重写它
  • 如果发生替换,转到脚本结尾(打印)
  • 如果不是,删除该行(并循环不打印)。此删除文件未以您的格式链接