이름이 2줄인 파일이 있다고 가정해 보겠습니다.파일.txt:
Row 1: 80 is a nice number
Row 2: 80 is a cool number
Row 3: 80 is a piquant number
Row 4: 80 is a sexy number
나는 이것을 했지만 sed -i 's/80/8080/g'
실수로 두 번 실행했고 모든 행의 결과 80808080
는 8080
.
sed
아마도 일반적인 기술로는 불가능할 것이라고 생각하지만, 파일에 한 번만 영향을 미치게 하는 정교한 방법이 있는지 묻고 싶습니다 . 내 말은 sed
, 잠금을 제거할 때까지 파일에서 이것을 여러 번 실행하는 것과 같은 오류를 피하기 위한 일종의 "잠금"을 의미합니다 . 이는 긴 줄, 특히 많은 수의 줄을 처리할 때 도움이 될 수 있습니다("아마도"라는 단어를 강조합니다).
이런 오류를 피해야 한다는 것은 실제로 질문이 아니라 그게 전부입니다. 그러나 이와 같은 오류를 피하기 위해 기술적 "방어 메커니즘"을 개발하려고 시도한 사람이 있는지 궁금합니다 sed
.
awk
참고: 유사한 솔루션이 사용자에게도 도움이 될 것이라고 생각합니다.
답변1
이는 그다지 복잡하지는 않지만 문자열을 자신을 포함하는 문자열로 바꿀 때 반복되는 교체를 방지하기 위해 이전 및/또는 다음 문자가 추가되는 방어 메커니즘입니다.
위의 예를 바탕으로 다음 중 하나(또는 둘 다)를 권장합니다.
sed -i 's/ 80 / 8080 /g'
sed -i 's/^80 /8080 /g'
또한 조심하세요 -i
:)
답변2
-i
특히 무언가를 시험해 보거나 일부 스크립트를 개발하는 경우에는 내부 편집 에 사용하지 마십시오 . 대신 임시 파일이 항상 기록됩니다. 그런 다음 파일이 괜찮은지 확인하고 원본 파일을 해당 파일로 바꾸십시오.
이 -i
옵션은 비표준이며 sed
구현 간에 이식성이 매우 낮습니다.
파일을 변경하는 이식 가능한 방법 sed
은 다음과 같습니다.
sed 'expression' file >newfile && mv newfile file
awk
같은 문제가 없습니다. awk
GNU는 모두 내부 편집(실제로 사람들이 자주 수행하고 싶어하는 작업은 아님)을 mawk
지원 하지 않으므로 실수로 파일에서 동일한 스크립트를 두 번 실행하는 문제(그리고 파일 편집의 "효과"가 두 배로 증가하는 문제)는 최소화됩니다. 나타나다.nawk
awk
awk