格式化文本并在特定模式之间添加文本部分
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
换句话说:-
- 在标签前的每个
/sdax
和 /media/$USER/
前添加文本 sudo mount /dev/
,例如:Documents+Edu
等
- 根据需要格式化。
如何使用 grep
、cut
、awk
、sed
等命令在 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 组文本,以新格式重写它
- 如果发生替换,转到脚本结尾(打印)
- 如果不是,删除该行(并循环不打印)。此删除文件未以您的格式链接
在 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
换句话说:-
- 在标签前的每个
/sdax
和/media/$USER/
前添加文本sudo mount /dev/
,例如:Documents+Edu
等 - 根据需要格式化。
如何使用 grep
、cut
、awk
、sed
等命令在 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 组文本,以新格式重写它 - 如果发生替换,转到脚本结尾(打印)
- 如果不是,删除该行(并循环不打印)。此删除文件未以您的格式链接