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