bash에서 문자가있는 경우에만 단어의 마지막 문자를 삭제하십시오.


13

마지막 문자가있는 경우에만 제거하는 방법은 무엇입니까?

입력:

OpenOffice.org/m
openOffice.org/ozm
Pers.
Pfg.
필.
교수
각하
Roonstr./m
roonstr./ozm

원하는 출력 :

OpenOffice.org
openOffice.org
퍼
Pfg
필
교수
Resp
루온 스트
roonstr

점까지만 남았지 만 불행히도 마지막 sed 명령도 문자를 제거합니다 g. $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

답변:


13

sed명령 에서 점을 이스케이프 처리하면 모든 것이 정상입니다. 이처럼 :

sed 's/\.$//'

이스케이프 처리하지 않으면 .$문자열 끝의 모든 문자와 일치합니다.

또한 모든 sed+ grep+ cut를 하나만 넣을 수 있습니다 sed.

sed 's=/[^/]*$==;s/\.$//' filename

정말 고마워요! :) 300k 줄 이상의 사전을 사용하므로 grep "\"를 사용하는 이유입니다. 점이있는 단어 만 가져옵니다.
7

sed는 다음과 같이 smth로도 수행 할 수 있습니다 sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. 어쨌든 grep+ sed는 하나보다 훨씬 오래 작동 sed합니다.
돌진

하나의 sed로 할 수 있다면 좋을 것입니다. 마지막 sed 명령을 적용하는 방법?
7

sed 's/[./]\+[^./]*$//'
Peter.O

고마워 이제 잘릴 필요는 없지만 grep은 여전히 ​​존재합니다. 내 파이프 grep 명령과 동등한 sed는 grep을 제거합니다. 가능하다면 좋을 것입니다. "또한 모든 sed + grep + cut을 단 하나의 sed에 넣을 수 있습니다"는 저에게 효과적이지 않습니다. 모든 단어를 인쇄합니까?
lastdot only가 2012 년

1

매개 변수 확장에 대한 설명 이있는 경우에만 문자를 제거하십시오 .

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

이 경우 점은 특별하지 않습니다 (점은 정규식에서는 특별합니다).

다른 패턴은 다음과 %/*같이 제거 할 수 있습니다 .

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

둘 다 제거하려면 다음을 수행하십시오.

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

물론 소스 파일로 작업하려면 파일에서 sed를 사용하는 것이 더 빠릅니다.
점을 인용하는 것만 기억하십시오 (문자 그대로 일치 시키려면 그렇지 않으면 모든 문자를 의미 함).

 $ sed 's,/.*,,;s,\.$,,' file

이것이 정답입니다. 더 많은 투표가 필요합니다.
David Parks

0

그냥 약간 정규 표현식을 변경하십시오를 탈출 . 그리고 당신은 필요하지 않습니다grep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.