다음과 같은 내용을 포함하는 많은 줄이 있는 xml 파일이 있습니다.
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\Drawing965.DWG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\File1.PNG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\Other.000" Module="0"
파일 이름을 제거하고 다른 모든 것을 유지하고 싶습니다. 다음과 같습니다:
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"
파일 이름과 폴더 이름은 꽤 다르지만 각 파일의 깊이는 동일합니다. 따라서 기본적으로 7번째 이후의 파일 이름은 삭제됩니다.
이 정규식을 함께 해킹했는데 작동하지만 xml의 다른 부분에 있는 파일 이름이 제거됩니다.
s/([a-zA-Z0-9_.-]+)\.([a-zA-Z0-9.]{3})$//g
답변1
Perl 방식:
perl -pne 's/^.+\\\K[^"]+//' file
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"
답변2
이것은 GNU sed를 사용하여 수행됩니다:
sed 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file
작동 방식은 다음과 같습니다.
\(
위의 사용 과\)
(이것은 캡처 그룹입니다) 사이에 있는 내용을 기억합니다 .- 따라서 첫 번째 캡처 그룹은 도달할 때까지 가능한 한 많은 것을 기억합니다
\\.*\..*
. 이는 문자 그대로의 백슬래시(이스케이프 처리해야 했기 때문에 두 개가 있음) 뒤에 임의의 문자 수와 문자 그대로의 점(이것은 파일 이름), 그 뒤에 a"
(두 번째 캡처 그룹을 시작하는 위치) 까지의 내용이 옵니다 . - 두 번째 캡처 그룹은 줄 끝까지 공백 앞에 오는 큰따옴표 뒤의 모든 내용을 기억합니다.
- 그런 다음 첫 번째 캡처 그룹의 기억된 내용으로 바꾸고
\1
그 뒤에 리터럴 백슬래시, 두 번째 캡처 그룹의 기억된 내용 및 을 입력합니다\2
.
원하는 대로 작동하는지 확인한 후 -i
대체 작업을 수행하려면 다음을 추가하세요.
sed -i 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file
입력:
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\Drawing965.DWG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\File1.PNG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\Other.000" Module="0"
산출:
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"