여러 파일(동일 디렉터리)의 문자열을 조건으로 바꿉니다.

여러 파일(동일 디렉터리)의 문자열을 조건으로 바꿉니다.

예:

파일 1:

Name: abc
Number: 325
Code: 0

파일 2:

Name: xyz
Number: 578
Code: 0

파일 3:

Name: ttt
Number: 356
Code: 0

파일 4:

Name: nnn
Number: 228
Code: 0

파일 5:

Name: bnb
Number: 434
Code: 0

문제는 어떻게 변하느냐이다.암호도착하다1제공되는숫자3xx또는2xx. 따라서 File2와 File5는 변경되지 않은 상태로 유지됩니다.

파일에는 약 100개 정도의 많은 줄이 있지만 이는 파일의 한 문자열(x 줄)을 바꾸는 방법에 대한 간단한 예일 뿐이지만 파일의 다른 문자열(y 줄)이 일치하는 경우에만 해당됩니다.

답변1

이 작업을 수행해야 합니다.

sed -i 's/^Code: 0$/Code: 1/' $(grep -l '^Number: [23]' File*)
  • 부품 sed이 물리적으로 교체됨
  • grep -l ... File*섹션에는 이름이 "File*"과 일치하고 행이 또는로 시작하는 모든 Number: 2파일이 나열됩니다.Number: 3
  • $(...)명령 주변의 구성은 grep다음과 같습니다.명령 대체나열된 파일은 grep다음으로 공급됩니다.sed

답변2

GNU 도구 사용:

grep -lxZ 'Number: [23]..' ./File* |
  xargs -r0 sed -i 's/^Code: 0$/Code: 1/'

답변3

가설숫자항상 앞에암호, 그리고암호어떤 값이든 가능하며 다음을 사용하십시오 sed.

sed -i '/^Number: [23]/{n;s/^Code: .*$/Code 1/}' File*

내용이 일관적이라면 다음 줄은 다음과 같습니다.숫자언제나코드 0, 다음과 같이 단순화할 수 있습니다.

sed -i '/^Number: [23]/{n;s/0/1/}' File*

답변4

사용하지 마세요sed원본으로 다시 리디렉션하면 파일 내용이 손상되므로 이 작업을 수행할 때 임시 파일을 만들 필요가 없습니다. 대신에편집하다.
파일 이름이 [a-zA-Z0-9_-] 범위에 있다고 가정합니다.

% cat scr.ed
1,$s/Code: 0/Code: 1/
w
q
% cat scr.sh
#!/bin/sh
for file in `grep -l '^Number: [23]' File*`
do
    ed -s $file <scr.ed
done

% chmod 755 scr.sh
% ./scr.sh

관련 정보