다음 행으로 구성된 파일이있는 경우
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로 반환합니다.
- ‘[^]’는 공백이없는 것과 일치합니다.
(더 나은 솔루션을 추가하기 위해 편집했습니다. 감사합니다. 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"
- BRE 경우-대체는 항상 수행되며 하나 이상의 문자가 남은 패턴 공간 만 인쇄됩니다.
- 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:]]
-그리고 공백 문자 -
/
-대체 할 표현의 시작 -
/
-명령 구문의 끝
추신 : 나는 명령에 별을 썼다.