提取某一行中特定字符串的一部分

提取某一行中特定字符串的一部分

假设我有一个包含如下行的文件:

/java/jdkxx/jvm_jdk/bin/opt
/java/jre/jre_jvm/bin/opt
/foo/bar/bin/other/stuff/here

有没有办法可以提取部分行到。bin我的意思是,假设这些行在file.txt

$ <some_command> file.txt 
/java/jdkxx/jvm_jdk/bin/
/java/jre/jre_jvm/bin/
/foo/bar/bin/

答案1

有很多方法可以做到这一点。以下是其中一些:

# greedily caputure up to the last slash
grep -o '.*/bin/' file.txt
# remove all non-slash chars from the end of each line
sed 's#\(/bin/\).*$#\1#' file.txt
# using slash as a delimiter, blank out the last field
awk -F/ -v OFS=/ '{for (i=1; i<=NF; i++) if ($i == "bin") {NF=i; break}} 1' file.txt

答案2

纯 bash 方式:

while read -n line
do
    [[ $line =~ /bin/ ]] && printf "%s\n" "${line/%\/bin\/*//bin/}"
done

答案3

什么,没有 Perl?

perl -ne 's#/bin\K.*## && print' file

如果你知道全部线条包含您想要的模式,您可以简化为:

perl -pe 's#/bin\K.*##' file

\K一个 PCRE 表达式,意思是“忽略 ”之前的所有内容\K


您还可以执行以下操作

awk -F"/bin" '{print $1FS}' file

这会将 awk 的字段分隔符 ( FS) 设置为/bin,然后打印第一个字段和 的值FS(即/bin)。同样,该方法假设您需要每一行。如果不是,请使用以下方法:

awk -F"/bin" '($2){print $1FS}' file

答案4

除了其他好的答案之外,您还可以尝试以下方法,以确保/bin/不会打印之后的任何内容:

grep -Po ".*/(?<=/bin/)" file

例子:

$ cat test_file 
/java/jdkxx/jvm_jdk/bin/opt
/java/jre/jre_jvm/bin/opt/home

$ grep -Po ".*/(?<=/bin/)" test_file 
/java/jdkxx/jvm_jdk/bin/
/java/jre/jre_jvm/bin/

这里我们使用聚合酶链反应通过积极的回顾(?<=/bin/)来确保我们只采取直到/我们/bin/最终得到的结果。

相关内容