특정 문자열까지 줄의 일부 추출

특정 문자열까지 줄의 일부 추출

다음과 같은 줄이 포함된 파일이 있다고 가정해 보겠습니다.

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

관련 정보