sed 및 regex를 사용하여 파일의 문자열에서 변수 설정

sed 및 regex를 사용하여 파일의 문자열에서 변수 설정

고쳐 쓰다보다 구체적인 정규식을 위해 스크립트를 약간 편집했지만 여전히 동일한 문제가 있습니다.

다음 질문을 명확히 하기 위해 이것은 작업을 시작하려는 정확한 스크립트(더 큰 스크립트의 경우 POC)이고 test.txt는 내 test.sh 파일과 동일한 디렉터리에 있으며 다음에서 스크립트를 CD로 복사하고 있습니다. 같은 디렉토리.

또한, 땜질하는 동안 캐리지 리턴과 관련이 있을 수도 있다고 생각했지만 여전히 무엇이 잘못되었는지 알 수 없습니다.

업데이트 종료

여기에 bash 파일을 붙여넣는 방법을 살펴보았는데 이를 실행하여 특정 파일에서 버전 번호를 추출하고 변수를 통해 해당 버전 번호로 작업을 수행할 수 있습니다. 스크립트의 나머지 부분은 매개 변수 $1을 통해 버전을 제공하면 작동하지만 작업하려는 폴더의 파일에서 직접 버전 번호를 확인할 수 있으면 좋을 것입니다.

이것은 내 현재 스크립트입니다.

#!/bin/sh
version=$(sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt)
printf 'detected version %s for test.txt\n' "$version"

터미널에서 이 값을 반환합니다.

 for test.txtion 0.6

인쇄하려는 문자열의 일부를 덮고 있는 것 같습니다. 이 부분만 보면 이렇습니다.

sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt

예를 들어, 이 줄을 포함하는 파일에 줄이 있으면 작동합니다.

Version: 0.6

알겠어요:

root@webserver [/home/username]# sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt
0.6
root@webserver [/home/username]#

스크립트에 어떤 문제가 있었는지 생각하시나요?

답변1

안되는 이유와 해결방법을 찾았습니다. 내 OP에서 @eike가 언급했듯이 문제는 DOS의 캐리지 리턴 \r이 출력을 덮어쓴다는 것입니다. 나에게 더 문제가 되는 것은 어떤 이유로든 내 변수에 \r이 추가된다는 것입니다.

파일이 정기적으로 업데이트되므로 \r을 수동으로 삭제할 수는 없습니다.

몇 가지 검색을 한 후 내 문제를 해결하고 문자열을 올바르게 인쇄한 것을 발견했습니다.

#!/bin/bash
version=$(sed 's/\r$//' test.txt | sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p")
printf 'detected version %s for test.txt\n' "$version"

여기서 하는 일은 먼저 텍스트에서 \r을 제거하고 이를 정규식 부분에 전달하는 것입니다. 예상되는 결과를 얻습니다.

감지된 test.txt 버전은 0.6입니다.

\r을 무시하는 정규식에서 이 작업을 수행할 수 있는 방법이 있다고 확신하지만, 적어도 이 작업은 완료됩니다!

관련 정보