![왜 이렇게 grep을 할 수 없습니까?](https://linux55.com/image/122112/%EC%99%9C%20%EC%9D%B4%EB%A0%87%EA%B2%8C%20grep%EC%9D%84%20%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
다음 파일에서 "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
...
}
편집하다:
@ilkkachu 덕분에 od 명령의 결과
[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
no
disable
\>
ex
vi
sed
공백으로 구분된 단어, ))도 일치합니다 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합니다.