왜 이런 식으로 grep을 할 수 없습니까?

왜 이런 식으로 grep을 할 수 없습니까?

다음 파일에서 "disable = yes" 줄을 "disable = no"로 변경하고 싶습니다.

[root@centos2 ~]# cat /etc/xinetd.d/tftp
service tftp
{
    ...
    server_args             = -s /var/lib/tftpboot
    disable                 = yes
    per_source              = 11
    ...
}  

나는 이것을 시도했다 :

[root@centos2 ~]# grep 'disable                 = yes' /etc/xinetd.d/tftp
[root@centos2 ~]#

마우스로 공간을 복사했지만 아무 것도 얻지 못합니다 ...

"disable"과 "=" 사이의 요소가 무엇인지 어떻게 알 수 있나요? 여러 공간인가요? 도표?

다음 정규식을 사용하여 grep을 수행할 수 있다는 것을 알고 있습니다.

[root@centos2 xinetd.d]# grep -E 'disable.+= yes' /etc/xinetd.d/tftp
    disable                 = yes
[root@centos2 xinetd.d]#

마지막으로 다음보다 sed를 사용하여 "yes"를 "no"로 바꾸는 더 좋은 방법이 있습니까?

[root@centos2 xinetd.d]# sed -r 's/disable.+= yes/disable                 = 
no/g' /etc/xinetd.d/tftp

service tftp
{
    ...
    server_args             = -s /var/lib/tftpboot
    disable                 = no
    per_source              = 11
    ...
}

편집하다 :

od 명령의 결과 @ilkkachu에게 감사드립니다

[root@centos2 xinetd.d]# < /etc/xinetd.d/tftp grep disable | od -c
0000000  \t   d   i   s   a   b   l   e
0000020                                       =       y   e   s  \n
0000037

답변1

공백은 "공백"으로 더 일반적으로 알려져 있으며 공백뿐만 아니라 탭(및 기타 "공백" 문자)도 포함할 수 있습니다. 정규식에서는 둘 다를 포함하는 [[:space:]]또는 \s(RE 엔진에 따라) 를 사용하여 이를 참조할 수 있습니다.수평의(사용 가능한 경우 공백, 탭 및 다양한 너비의 일부 유니코드 간격 문자)를 사용할 수도 있고 [[:blank:]]때로는 \h수직의공백 문자(예: 줄 바꿈, 폼 피드, 세로 탭 또는 캐리지 리턴). Microsoft 텍스트 파일의 가짜 캐리지 리턴 문자를 가리기 위해 [[:space:]]대신 사용되는 경우가 있습니다 .[[:blank:]]

다음으로 대체할 수 없습니다 grep. 이는 단지 검색 도구일 뿐입니다. 대신에 yes다음 no과 같은 명령을 사용할 수 있습니다.

sed '/disable\>/s/\<yes\>/no/' /etc/xinetd.d/tftp

이는 단어가 포함된 모든 줄에서 sed단어를 로 대체(변경)하라는 yes의미 입니다 . ( 일부 구현에서는 (초기 / 정규식 연산자) 는 단어 끝을 강제로 표시합니다.nodisable\>exvised공백으로 구분된 단어disable-option, )) 에서도 일치합니다 . 편리하게도 이는 공백 문제를 완전히 회피합니다.


주의하세요. 와 같은 줄을 사용하면 eyes yes무제한 yes대체가 의 첫 번째 인스턴스에 적용되고 yes가 남게 됩니다 eno yes. 그래서 나는 \<yes\>단지 yes.

답변2

"disable"과 "=" 사이의 요소가 무엇인지 어떻게 알 수 있나요? 여러 공간인가요? 도표?

아마도 탭일 겁니다. 당신은 다음과 같은 것을 사용할 수 있습니다

< /etc/xinetd.d/tftp grep disable | od -c

보다. 탭은 \t, 공백은 공백으로 표시됩니다 .

답변3

grep 대안을 사용해보십시오.체로 치다~에서선별 도구.org- 지능형 정규식 패턴 일치를 수행하는 steriods에 대한 grep입니다.

관련 정보