파일에서 문자열을 추출하고 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 -o
sed
이는 데이터 추출 및 변환을 위해 및 의 조합을 사용합니다 .
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