SED 임시 파일을 사용하지 않고 파일에서 문자열 찾기 및 바꾸기

SED 임시 파일을 사용하지 않고 파일에서 문자열 찾기 및 바꾸기

아래와 같이 Sample.text라는 텍스트 파일이 있습니다.

Continent Lat/Lon: 46.07305 / -100.546
Country Lat/Lon: 38 / -98
City Lat/Lon:(37.3845) / (-122.0881)

임시 파일을 사용하지 않고 이 텍스트를 처리하여 아래와 같은 출력을 얻고 싶습니다.

Continent Lat/Lon: 46.07305 / -100.546
Country Lat/Lon: 38 / -98
City Latitude: (37.3845) 
City Longitude: (-122.0881)

위도/경도 값을 제어할 수 없습니다.

나는 2개의 awk 스크립트를 사용하여 이 작업을 수행했습니다.

BEGIN { FS=":"}  {print $2} | BEGIN { FS="/"}  {printf "City Latitude:%s\nCity Longitude:%s\n",$1,$2} 

raw 파일에 쓰고 싶은데 사용할 수 있는 방법이 있나요?

sed -i  

모든 의견을 보내주시면 감사하겠습니다.

답변1

sed -i 's,^City Lat/Lon:(\(.*\)) / (\(.*\))$,City Latitude: (\1)\nCity Longitude: (\2),' /path/to/file

설명하다

  • sed -i 's,foo,bar,' /path/to/file여기서는 대신 구분 기호로 사용 하므로 이스케이프하지 않고도 문자열에서 사용할 sed수 있습니다 .foobar,//
  • ^City Lat/Lon:(\(.*\)) / (\(.*\))$^: 및 가 $각각 줄의 시작과 끝이고, 둘이 각각 \(.*\)캡처링 그룹을 나타내는 이 정규식의 발생을 찾습니다 .
  • City Latitude: (\1)\nCity Longitude: (\2):는 이 문자열로 대체됩니다. 여기서 \1\2는 첫 번째 표현식에서 캡처된 그룹을 나타내고 는 \n개행 문자입니다.

답변2

이를 통해 sed -i진정한 내부 편집을 수행할 수 있습니다.불가능한, 왜냐하면 그 뒤에서 실제로 임시 파일을 생성하기 때문입니다.

그러나 결과를 어딘가에 저장한 다음 파일에 쓸 수 있습니다. 쉬운 방법은 bash 변수를 사용하는 것입니다.

파일이 너무 크지 않은지 확인하세요. 대부분의 파일에는 문제가 없지만 로그 파일이 있으면 69 GB로그 파일에 쓸 수 있습니다 /tmp/.


변화

sed -i '<some regex>' --any-flags-you-want /some/file

도착하다

SED_RESULT=$(sed '<some regex>' --any-flags-you-want) && echo ${SED_RESULT} > /some/file

관련 정보