아래와 같이 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
수 있습니다 .foo
bar
,
/
/
^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