
다음과 같은 줄이 포함된 파일이 있다고 가정해 보겠습니다.
/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/
여기서 우리는PCRE긍정적인 시선으로 우리가 마지막으로 가지고 있는 곳 (?<=/bin/)
까지만 가져갈 수 있도록 합니다 ./
/bin/