我有一个包含文件路径的 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
,但我并不熟悉。
答案1
使用cut
:
$ cat filelist.txt
./first/example1/path
./second/example1/path
./third/example2/path
$ cut -d/ -f2 filelist.txt
first
second
third
$ cut -d/ -f3 filelist.txt
example1
example1
example2
将-d/
列分隔符设置为/
并-f2
选择第二列。
当然,您也可以使用 Bash 变量代替文件名或将数据传输到命令中cut
:
cut -d/ -f3 $MyVariable
echo ./another/example/path | cut -d/ -f3
答案2
您可以直接在read
命令中使用IFS
变量执行此操作,例如
$ while IFS=/ read -r p1 p2 p3 r; do echo "$p2"; done < filelist.txt
first
second
third
答案3
您可以使用awk
pilot6@Pilot6:~$ cat filelist.txt
./first/example1/path
./second/example1/path
./third/example2/path
pilot6@Pilot6:~$ awk -F "/" '{print $2}' filelist.txt
first
second
third
pilot6@Pilot6:~$ awk -F "/" '{print $3}' filelist.txt
example1
example1
example2
答案4
Bashcut
是可行的方法,但是使用 Perl 也可以替代:
perl -F/ -lane 'print(@F[1])' filelist.txt
对于第二个/
分隔字段和
perl -F/ -lane 'print(@F[2])' filelist.txt
对于第三个/
- 分隔字段。
-l
: 启用自动行结束处理。它有两个不同的效果。首先,当与 -n 或 -p 一起使用时,它会自动剪切 $/(输入记录分隔符)。其次,它为 $\(输出记录分隔符)分配 octnum 的值,以便任何打印语句都会重新添加该分隔符。如果省略 octnum,则将 $\ 设置为 $/ 的当前值。-a
:与 -n 或 -p 一起使用时打开自动拆分模式。对 @F 数组的隐式拆分命令是 -n 或 -p 生成的隐式 while 循环中的第一件事。-n
:导致 Perl 假设您的程序周围有以下循环,这使得它像 sed -n 或 awk 一样迭代文件名参数:LINE: while (<>) { ... # your program goes here }
-e
:可用于输入一行程序;print(@F[N])
:打印第 N 个字段。
% cat filelist.txt
./first/example1/path
./second/example1/path
./third/example2/path
% perl -F/ -lane 'print(@F[1])' filelist.txt
first
second
third
% perl -F/ -lane 'print(@F[2])' filelist.txt
example1
example1
example2