텍스트 파일에서 여러 문자열을 찾아 반환합니다.

텍스트 파일에서 여러 문자열을 찾아 반환합니다.

파일에서 문자열을 추출하고 bash를 사용하여 다른 파일에 추가하는 방법을 찾고 있습니다. 관련 파일에는 다음 형식의 데이터가 포함됩니다.

Data="/dataset/0001" a bunch of random stuff I don't need Data="/dataset/0002" more random stuff Data="/dataset/0003"

등.

큰따옴표(예:,,,,,etc) 사이에 있는 문자열을 추출하여 반환하고 싶습니다 /dataset/0001. /dataset/0002/dataset/0003

이 문제를 해결하는 방법에 대한 제안이 있으십니까?

후속 질문으로 /home/user각 반환 값(예: , 등) 앞에 상수 문자열(예:)을 추가 할 수 있다면 깔끔 할 것입니다 /home/user/dataset/0001./home/user/dataset/0002/home/user/dataset/0003

이에 대한 조언을 보내주셔서 감사합니다.

답변1

$ grep -o 'Data="[^"]*"' file | sed 's,Data=",/home/user,; s/"$//'
/home/user/dataset/0001
/home/user/dataset/0002
/home/user/dataset/0003

grep -osed이는 데이터 추출 및 변환을 위해 및 의 조합을 사용합니다 .

grep -o각 비트를 Data="..."별도의 라인으로 끌어오고 sed각 라인을 먼저 Data="로 바꾼 /home/user다음 "끝에서 삭제하십시오.

답변2

펄 사용:

$ perl -lnE 'say for map { "/home/user" . $_ } /Data="(.*?)"/g' file
/home/user/dataset/0001
/home/user/dataset/0002
/home/user/dataset/0003

답변3

나는 이것을하는 것을 권장하지 않습니다. 왜냐하면

하지만 설명을 위해 bash =~연산자를 반복적으로 적용해 보겠습니다.

#!/bin/bash

pfx="/home/user"

re='Data="([^"]*)"'

while read -r line; do 
  while [[ $line =~ $re ]]; do
    printf '%s%s\n' "$pfx" "${BASH_REMATCH[1]}"
    line="${line#*${BASH_REMATCH[0]}}"
  done
done < file

답변4

출력을 얻는 데 사용할 수 있는 몇 가지 방법은 다음과 같습니다.

perl -lsne '
  () = /Data="(.*?)"(?{print "$v$1"})/g;
' -- -v="/home/user" file 

grep -oP 'Data="\K[^"]+(?=")' file |\
xargs printf '/home/user%s\n'

sed -nEe '
  s|Data="([^"]+)"|\n/home/user\1\n|
  s/.*\n(.*\n)/\1/
  P;D
' file 

/home/user/dataset/0001
/home/user/dataset/0002
/home/user/dataset/0003

관련 정보