sed 명령을 사용하여 리눅스에서 각 줄의 마지막 단어를 인쇄 할 수 있습니까? 12345567 7878 66 er3

다음 행으로 구성된 파일이있는 경우

12345567 7878 66

   er3 t45t y6y46y


 4y6 y656y y5y

   46y6 65y7 y66uyuy

 yy46y6y

출력은 다음과 같아야합니다.

66

y6y46y

y5y

y66uyuyy

y46y6y

명령 sed 's/.* //g'파일 이름과 다른 여러 명령을 시도했지만 sed작동하지 않습니다.

정확한 sed명령 이 무엇인지 알 수 있습니까 ?



답변

awk '{print $NF}'
sed 's/[[:blank:]]*$//;s/.*[[:blank:]]//'

빈 줄마다 빈 줄이 인쇄됩니다. 그것을 피하려면 :

awk 'NF{print $NF}'
sed 's/[[:blank:]]*$//;s/.*[[:blank:]]//;/./!d'

답변

awk변수 $NF는 IS 모든 레코드의 마지막 필드 ; 다음과 같이 파일의 마지막 필드 만 인쇄하는 데 사용할 수 있습니다.

awk '{print $NF}' file

답변

당신은 시도 할 수 있습니다 :

  • sed 's/.* //'
  • awk '{print $NF}'

답변

거의 다 왔습니다. 마지막 단어를 지정하십시오.

sed 's/^.* \([^ ][^ ]*\)/\1/g'

그것이하는 일 :

  1. ‘^. *’는 줄의 시작 부분과 공백을 모두 삭제합니다.
  2. ‘\ (…) \’는 패턴과 일치하여 \ 1로 반환합니다.
  3. ‘[^]’는 공백이없는 것과 일치합니다.

(더 나은 솔루션을 추가하기 위해 편집했습니다. 감사합니다. Hildred!)


답변

예를 들어, grep대신에 적절한 패턴을 사용할 수 있습니다 sed.

grep -o "[a-Z0-9]*$"

이 예에서, [...]“word”에 적합한 것으로 간주되는 문자 범위를 포함합니다 (이 경우 영숫자, 다른 기호를 추가 할 수 있으며 일부는 이스케이프해야 함).


답변

1 개 이상의 공백이 아닌 문자 시퀀스 를 의미 하도록 단어 를 한정 하면 대답은 확실히 그렇습니다. 아주 간단하게 수행됩니다. 때문입니다 및 문자열의 모든 문자를 제공 완료 – – 부울 보완하고는 U가 거의 같은 방법으로 가능한 모든 문자열을 설명 할 수 않습니다.[[:blank:]]*[^[:blank:]]*[[:blank:]]*[^[:blank:]]*.*

불완전한 문자 또는 유효하지 않은 바이트 시퀀스가 ​​문자열 내에 존재하는 경우, 잘못된 인코딩으로 문자열을 해석 할 때 때때로 발생할 수있는 것처럼이를 머리부터 꼬리까지 성공적으로 설명 할 수 없습니다. 모든 문자열에서 바이트 당 완전한 문자를 보장하기 위해 C 로케일은 다음과 같이 강제 될 수 있습니다.

LC_ALL=C sed ...

.*또는 과 같은 포괄적 인 패턴으로 머리부터 꼬리까지 문자열을 설명하는 문제를 피할 수 있습니다.([ ]*[^ ]*)*

완전 보완 패턴은 패턴의 끊김없이 마지막 발생시 착륙 할 문자열의 길이를 왼쪽에서 오른쪽으로 여러 번 반복 할 수 있습니다. 이것은 확실히 정규 언어입니다.

BRE :

sed 's/\(\([^[:blank:]]*\)[[:blank:]]*\)*/\2/'

오히려:

sed -E 's/(([^[:blank:]]*)[[:blank:]]*)*/\2/'

이 두 버전 모두 여전히 빈 줄을 인쇄하며 이는 Kleene *별이 0 개 이상의 패턴 발생과 일치 하기 때문 입니다. 먼저 공백 문자가 아닌 0 개 이상, 공백 문자가 0 개 이상, 문자열이 완전히 일치 할 때까지 그룹화 된 일치 항목이 0 개 이상 일치합니다.

이 모든 일치하는 데, 마법 교체에서 일어나는 – 참조가 그룹에 의해 반환 \1하고 \2각각의 마지막 발생합니다. 따라서 대체 할 때 모든 문자열은 0 개 이상의 빈 문자가 아닌 행 또는 하위 그룹의 마지막 행으로 만 바뀝니다 \2.

물론 이것은 가능한 문자열-심지어 비어있는 문자열에서 작동합니다. 즉, 두 형식 모두 공백 문자 만 포함하거나 전혀 포함하지 않는 행에 대해 줄 바꿈 문자를 인쇄합니다. 이를 처리하기 위해 몇 가지 작업을 수행 할 수 있지만 먼저 문자 클래스를 좀 더 쉽게 입력 할 수 있습니다.

b='[:blank:]'

이제 한 줄에 공백이 아닌 문자가 하나 이상 포함 된 경우에만 인쇄하려면 다음을 수행하십시오.

BRE :

sed -n "s/\(\([^$b]*\)[$b]*\)*/\2/;/./p"

오히려:

sed -En "/[^$b]/s/(([^$b]*)[$b]*)*/\2/p"
  1. BRE 경우-대체는 항상 수행되며 하나 이상의 문자가 남은 패턴 공간 만 인쇄됩니다.
  2. ERE 경우-공백 문자가 아닌 하나 이상의 패턴 공간에서만 대체가 시도됩니다.

구문이 올바른 경우 어느 형식이든 어느 방법 으로든 작동합니다.

-n패턴 공간의 스위치 비활성화 인쇄 자동 및 p받는 플래그 s///ubstitution 또는 /주소 /명령의 결과를 경우에만 성공적으로 인쇄합니다.

다음과 같이 동일한 논리를 적용하여 모든 {num}발생 을 얻을 수 있습니다 .

BRE :

sed -n "s/\([$b]*\([^$b]\{1,\}\)\)\{num\}.*/\2/p"

오히려:

sed -En "s/([$b]*([^$b]+)){num}.*/\2/p"

여기서 num두 정규 표현식의 숫자는 숫자로 대체되어 {num}공백 문자가 아닌 일련의 지정된 항목 만 인쇄 할 수 있습니다 . 여기에서는 문자열의 선행 공간에 대해 카운트가 기울어지지 않도록 약간 다른 형식이 사용됩니다.

참고 그 -E에게 ERE 스위치 sed가 아니지만, BSD와 GNU 버전 모두 지원됩니다 아직 POSIX 표준 구문.


답변

sed 's/^ star.star //'  filename  or sed 's/^[[:blank:]]star.star[[:blank:]]//' filename

분석:

  • s -대체

  • / -찾을 표현의 시작

  • ^ -줄의 처음부터

  • [[:blank:]]* -줄의 시작 부분에 공백이있는 경우

  • .* -어떤 캐릭터

  • [[:blank:]] -그리고 공백 문자

  • / -대체 할 표현의 시작

  • / -명령 구문의 끝

추신 : 나는 명령에 별을 썼다.