
讓我們假設我有一個文件,其中包含以下行:
/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/