sed 및 regex를 사용하여 파일에서 여러 대체 수행

sed 및 regex를 사용하여 파일에서 여러 대체 수행

다음과 같은 파일이 있습니다.

one line
echo number_format($row1[$z+1],2,",",".");
echo "<b><font color=red>".number_format($mount_01,2,",",".")."</font></b>";
echo "<b><font color=red>".number_format($mount_02,2,",",".")."</font></b>";
other line
<td bgcolor="red"><b><font color="white"><?echo number_format($general,2,",",".");?></font></b></td>
another line
<td><font size=4><b><?echo number_format($sum_total,2,",",".");?></font></b></td>

쉼표는 number_format을 포함하는 줄뿐만 아니라 파일의 모든 줄에 존재할 수 있습니다.

다음 정규식을 사용하세요: grep -Eo 'number_format\(\$([a-zA-Z0-9_]|([a-zA-Z0-9_]{1,}|)[a-zA-Z0-9_\\]{1,}\[\$[a-zA-Z0-9](\+[a-zA-Z0-9])*{1,}(\]))*,[0-9],",",".")' file 일치:

number_format($row1[$z+1],2,",",".")
number_format($mount_01,3,",",".")
number_format($mount_02,2,",",".")
number_format($general,3,",",".")
number_format($sum_total,4,",",".")

첫 번째 쉼표 뒤의 첫 번째 숫자를 4로 변경하고 싶습니다.

one line
echo number_format($row1[$z+1],4,",",".");
echo "<b><font color=red>".number_format($mount_01,4,",",".")."</font></b>";
echo "<b><font color=red>".number_format($mount_02,4,",",".")."</font></b>";
other line
<td bgcolor="red"><b><font color="white"><?echo number_format($general,4,",",".");?></font></b></td>
another line
<td><font size=4><b><?echo number_format($sum_total,4,",",".");?></font></b></td>

제가 지금까지 상담한 내용은우편 엽서

나는 이것을 할 수 있다

grep -Eo 'number_format\(\$([a-zA-Z0-9_]|([a-zA-Z0-9_]{1,}|)[a-zA-Z0-9_\\]{1,}\[\$[a-zA-Z0-9](\+[a-zA-Z0-9])*{1,}(\]))*,[0-9],",",".")' file |sed -E '1,$ s/^("[^"]*"|[^",]*)(, *)[0-9]*,/\1\24,/'

그것은 나에게 다음과 같은 결과를 제공합니다.

number_format($row1[$z+1],4,",",".")
number_format($mount_01,4,",",".")
number_format($mount_02,4,",",".")
number_format($general,4,",",".")
number_format($sum_total,4,",",".")

하지만 내가 원하는 방식으로 파일을 교체하지 않습니다. 나는 이것이 sed에서 정규식 그룹을 캡처하는 것과 관련이 있다는 것을 알고 있습니다.

지금까지 수행한 작업에 대한 추가 정보를 추가하기 위해 이 게시물을 편집하면 예상 결과는 다음과 같습니다.

one line
echo number_format($row1[$z+1],4,",",".");
echo "<b><font color=red>".number_format($mount_01,4,",",".")."</font></b>";
echo "<b><font color=red>".number_format($mount_02,4,",",".")."</font></b>";
other line
<td bgcolor="red"><b><font color="white"><?echo number_format($general,4,",",".");?></font></b></td>
another line
<td><font size=4><b><?echo number_format($sum_total,4,",",".");?></font></b></td>

Romeo Ninov가 제안한 솔루션을 사용하면 이 결과를 얻을 수 있지만 화면에서만 작동하고 변경 사항이 저장되지 않습니다. 그렇기 때문에 sed를 사용하고 싶고, 디렉토리의 모든 파일을 변경하려는 경우에는 더욱 그렇습니다.

함수 번호 형식이 포함된 표현식을 세 개의 정규식으로 분할했습니다.

number_format\(\$([a-zA-Z0-9_]{1,}(\[\$[a-zA-Z0-9_]{1,}\+[a-zA-Z0-9]{1,}(\]))*,))

[0-9], 무엇을 바꾸고 싶은가요?

(\,\"\,\"\,\"\.\"\))

이 코드를 사용해 보면 다음과 같습니다.

sed -E 's/(number_format\(\$([a-zA-Z0-9_]{1,}(\[\$[a-zA-Z0-9_]{1,}\+[a-zA-Z0-9]{1,}(\]))*,))/\14/' file

그것은 나에게 다음을 제공합니다:

one line
echo number_format($row1[$z+1],42,",",".");
echo "<b><font color=red>".number_format($mount_01,42,",",".")."</font></b>";
echo "<b><font color=red>".number_format($mount_02,42,",",".")."</font></b>";
other line
<td bgcolor="red"><b><font color="white"><?echo number_format($general,42,",",".");?></font></b></td>
another line
<td><font size=4><b><?echo number_format($sum_total,42,",",".");?></font></b></td>

마지막 정규식을 사용하면

sed -E 's/(\,\"\,\"\,\"\.\"\))/4\1/' file

나에게주세요

one line
echo number_format($row1[$z+1],24,",",".");
echo "<b><font color=red>".number_format($mount_01,24,",",".")."</font></b>";
echo "<b><font color=red>".number_format($mount_02,24,",",".")."</font></b>";
other line
<td bgcolor="red"><b><font color="white"><?echo number_format($general,24,",",".");?></font></b></td>
another line
<td><font size=4><b><?echo number_format($sum_total,24,",",".");?></font></b></td>

하지만 첫 번째 것을 las regex와 결합하면 작동하지 않고 변경 사항 없이 원본 파일을 반환합니다.

sed -E 's/(number_format\(\$([a-zA-Z0-9_]{1,}(\[\$[a-zA-Z0-9_]{1,}\+[a-zA-Z0-9]{1,}(\]))*,))(\,\"\,\"\,\"\.\"\))/\14\2/' file

one line
echo number_format($row1[$z+1],2,",",".");
echo "<b><font color=red>".number_format($mount_01,2,",",".")."</font></b>";
echo "<b><font color=red>".number_format($mount_02,2,",",".")."</font></b>";
other line
<td bgcolor="red"><b><font color="white"><?echo number_format($general,2,",",".");?></font></b></td>
another line
<td><font size=4><b><?echo number_format($sum_total,2,",",".");?></font></b></td>

그렇다면 어떻게 작동하게 만들까요?

답변1

awk비슷한 것을 사용해 볼 수 있습니다 .숫자 형식두 번째 필드를 변경합니다(쉼표를 구분 기호로 사용).

awk -F\, 'BEGIN {OFS=","} /number_format/ { $2=4} {print $0}' input_file >output_file

관련 정보