我有一个 ASCII 文件,其中包含我通过运行读取的文件路径:
while read p; do echo $p; done < filelist.txt
该文件包含具有以下模式的文件路径:
./first/example1/path
./second/example1/path
./third/example2/path
如何获取路径字符串的特定部分(从/
到/
),例如,我需要获取打印的输出:
first
second
third
并且
example1
example1
example2
我确信有一种方法可以使用正则表达式和sed
,但我不熟悉它。
使用
cut
:将
-d/
列分隔符设置为/
并-f2
选择第二列。当然,您也可以使用 Bash 变量而不是文件名或将数据通过管道传输到
cut
命令中:您可以使用变量直接在
read
命令中执行此操作,例如IFS
您可以使用
awk
如果我们想要路径的任何元素,最好使用可以将字符串分解为字段的东西,例如awk、cut、python或perl。但是,bash也可以通过参数替换来完成这项工作,使用模式替换并将所有内容放入数组中。
现在我们有一个由路径组成的项目数组。请注意,如果路径包含空格,则可能涉及更改内部字段分隔符
IFS
。Bash 和
cut
是要走的路,但是使用 Perl 的替代方法:对于第二个
/
分隔字段和对于第三个
/
分隔字段。-l
:启用自动换行处理。它有两个不同的效果。首先,当与 -n 或 -p 一起使用时,它会自动选择 $/(输入记录分隔符)。其次,它分配 $\(输出记录分隔符)具有 octnum 的值,以便任何打印语句都会重新添加该分隔符。如果省略 octnum,则将 $\ 设置为 $/ 的当前值。-a
: 与 -n 或 -p 一起使用时打开自动拆分模式。@F 数组的隐式拆分命令作为 -n 或 -p 生成的隐式 while 循环内的第一件事完成。-n
: 导致 Perl 在你的程序周围假设以下循环,这使得它迭代文件名参数,有点像 sed -n 或 awk:-e
:可用于输入一行程序;print(@F[N])
:打印第 N 个字段。