sed - 변수를 사용하여 파일의 복잡한 줄 바꾸기

sed - 변수를 사용하여 파일의 복잡한 줄 바꾸기

sed를 사용하여 파일의 복잡한 줄을 바꾸는 방법은 무엇입니까?

예를 들어, /etc/udev/rules.d/70-pertant-net.rules에서 udev 규칙을 바꾸고 싶습니다.

이것은 작동하지 않습니다:

OLD_RULE='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"'

NEW_RULE='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"'


sed -i "s/$OLD_RULE/$NEW_RULE/g" /etc/udev/rules.d/70-persistent-net.rules

파일은 변경되지 않은 상태로 유지됩니다.

답변1

패턴 마법 문자로 해석될 수 있는 OLD_RULE의 모든 문자를 이스케이프해야 합니다. 또는 더 간단하게는 작업하려는 라인과 일치하는 패턴을 사용한 다음 실제로 필요한 최소한의 교체만 수행합니다.

어쩌면 비슷한 것일 수도 있습니다(테스트되지 않음) sed -i '/, NAME="eth1"/s/eth1/eth0/' /etc/udev/rules.d/70-persistent-net.rules.

답변2

때때로 작동할 수 있는(이 특정 예에서는 작동했습니다) 방법은 printf참조 기능과 다음을 사용하는 것입니다 sed -r.

old_rule='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"'
new_rule='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"'
printf -v sed_repl 's/%q/%q/g' "$old_rule" "$new_rule"
sed -r -i "$sed_repl" /etc/udev/rules.d/70-persistent-net.rules

관련 정보