將行的一部分提取到特定字串

將行的一部分提取到特定字串

讓我們假設我有一個文件,其中包含以下行:

/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

the\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/

相關內容