sed를 사용하여 일치하는 줄의 단어를 바꾸는 방법은 무엇입니까?

sed를 사용하여 일치하는 줄의 단어를 바꾸는 방법은 무엇입니까?

다음과 유사한 줄을 감지하기 위해 sed 표현식을 작성하려고 합니다.

s0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux

그리고 ttys0로 교체something_else

#주석 처리된 행(으로 시작 ) 을 감지하고 싶지 않습니다.

전체 줄을 바꿀 수 있지만 나머지 줄은 변경하지 않고 부분 문자열만 바꾸려면 어떻게 해야 합니까?

답변1

이를 수행하는 한 가지 방법은 다음과 같습니다.

echo 's0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux' | 
    sed -e '/^[^#]/ s/ttyS0/foo/'

답변2

ttyS0 앞 부분과 ttyS0 뒤 부분을 일치시키고 줄이 다음으로 시작하지 않는지 확인하세요 #.

sed 's/^[^#]\(.*\)ttyS0\(.*\)/\1something\2/'

결과:

%> echo "s0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux" | sed 's/^[^#]\(.*\)ttyS0\(.*\)/\1something\2/'
0:12345:respawn:/sbin/agetty -8 -s 115200 something linux

답변3

항상 이것으로 시작한다면 s[number]colon(GNU sed를 사용하여) 다음을 수행할 수 있습니다.

sed -r '/^s[0-9]+:/s/ttyS0/something_else/' infile

이렇게 하면 필요에 맞게 정규식으로 시작하는 모든 줄이 변경됩니다.

관련 정보