다른 값에 영향을 주지 않고 두 개의 동일한 값을 sed하는 방법

다른 값에 영향을 주지 않고 두 개의 동일한 값을 sed하는 방법

XML 파일이 있는데 파일의 값을 변경하고 싶습니다.

param name=swam_license_ports_overdraft_thresh

99

param name="strike_license_ports_overdraft_thresh"

99

내가 원하는 결과는 param name=swam_license_ports_overdraft_thresh 아래의 값 99가 90으로 변경되고 param name="strike_license_ports_overdraft_thresh" 아래의 다른 값 99는 변경되어서는 안 된다는 것입니다.

답변1

내가 올바르게 이해했다면 첫 번째 일치 항목만 제거하려는 것이므로 다음과 같이 할 수 있습니다.

sed -e '/99/{s//XXX/;:a;n;ba}' file

GNU를 사용하면 sed다음을 수행할 수 있습니다.

sed -e '0,/99/s//XXX/' file

답변2

첫 번째 일치 항목 제거(행 유지)

awk '!x&&/99/{x++;$0=y}1' file

첫 번째 일치 항목 제거(행을 유지하지 않음)

awk '!x&&/99/{x++;next}1' file

첫 번째 일치 항목 바꾸기

awk '!x&&/99/{x++;$0="98"}1' file

답변3

sed -n 'h;/match/n;G;P;//D'

첫 번째 항목만 삭제됩니다.성냥모든 입력 파일에서. 그것

  • h각 행은 기존 공간을 덮습니다.

  • 다음 입력으로 패턴 공간 덮어쓰기성냥철사

  • Gets는 패턴 공간에 추가된 공간을 예약합니다.

  • P\n패턴 공간에서 처음으로 나타나는 ewline 문자 까지 인쇄합니다.

  • D동일한 요소성냥철사

그런데 문제는 이 과정이모든첫 번째 발생 이후의 행성냥또한 된다성냥다음 줄에 도달하기 전에. 따라서 항상 일치하고 인쇄되지 않습니다.

sed '/match/x;//x'

이 값은 다음의 첫 번째 항목을 대체합니다.성냥빈 줄이 있는 파일.

  • 존재하다성냥sede라인은 기존 공간과 패턴 공간을 x변화시킨다 .h

  • 새로운 패턴 공간이라면(오래된 패턴 공간)반품성냥그게 x또 바뀌네

  • 그렇지 않으면 첫 번째 발생을 그대로 유지합니다.성냥신구 h공간과 인쇄 여백 패턴 공간에

관련 정보