적절하게 질문하는 방법을 잘 모르겠지만 사용 사례는 다음과 같습니다.
<way id="foo">... <\way>
bad_ways
for 루프를 sed
작성하고 다음과 같은 명령문을 순환 할 수 있습니다 .
sed -i.bu '/<way id="1_bad_way_entry".*/,/<\/way>/d' in.xml
하지만 ... 이것은 18G 파일 및 관련 디스크 쓰기 등을 통해 ~ 250 사이클을 필요로합니다. 현재는 사이클 당 약 18 분이 걸립니다 (디스크 회전 ...이 문제는 곧 기계를 전환하여 해결됩니다. 업데이트 : SSD는 약 6.5로 개선됩니다. 최소주기).
모든 항목 sed
을 일치 시키고 1 패스로 수행 하도록 요청할 수 있는 방법 이 있습니까?bad_ways
아니면 이것보다 더 나은 도구가 sed
있습니까? 미리 감사드립니다!
명령 대체를 사용 sed
하여 실행시 스크립트 를 어셈블 할 수 있습니다 .
(참고 : 다음 에서는 백 슬래시를 저장하기 위해 sed
의 -E
옵션을 사용 sed
합니다. 필요에 따라 백 슬래시를 포함하여 스크립트 를 생성 할 필요가 없습니다 .)
예를 들어, bad_ways
파일이 다음과 같다고 가정합니다 .
one
two
three
다음과 huge_file
같습니다.
everything starts with a zero, then one is next, then two, then three, finally four
당신은에있는 모든 패턴을 대체 할 다음 명령을 사용하여 작업을 수행 할 수 bad_ways
와를 XXX
:
sed -E 's/'"$(sed -zE 's/\n([^$])/|\1/g' bad_ways)"'/XXX/g' huge_file
그런 다음 출력은
everything starts with a zero, then XXX is next, then XXX, then XXX, finally four
보시다시피 sed
에서 작동 하는 스크립트는 huge_file
세 개의 문자열을 연결하여 구성됩니다.
s/
작은 따옴표로 묶습니다 (2에서와 같이 큰 따옴표가 필요하지 않으면 항상 작은 따옴표를 선호해야합니다.)sed -zE 's/\n([^$])/|\1/g' bad_ways
명령 대체를 허용하기 위해 큰 따옴표로 묶여 있고 생성되는 의 출력one|two|three
/XXX/g
.이 모든 결과는 문자열이 s/one|two|three/XXX/g
됩니다.
이 명확하게 당신이 당신의 스크립트 필요로하는 문자열이 아닌,하지만 난이 답변 쇼 당신의 예를 바란다 명령 치환을 사용하는 방법 $(…)
과 함께 인용 적절한 '
및 "
명령 (만드는 법 sed
, awk
동적이든 뭐든) .
돌이켜 보면이 답변은 댓글에 연결된 답변의 것과 동일한 "철학"을 기반으로합니다. 그러나 스크립트를 파일에 임시로 저장하는 것은 아닙니다. 스크립트 자체가 작은 경우 (그리고 설명에 따라 작은 경우) 이는 중요하지 않을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다