使用 bash 获取路径字符串的一个元素

使用 bash 获取路径字符串的一个元素

我有一个包含文件路径的 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

相关内容