예:
파일 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