없이 사용 sed
하거나 awk
, 전용 cut
필드의 수는 모든 라인에 알 수없는하거나 변경할 때, 어떻게 마지막 필드를받을 수 있나요?
답변
다음과 같이 시도해보십시오.
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
설명
rev
“maps.google.com”을 반대로moc.elgoog.spam
cut
점 (예 : ‘.’)을 구분 기호로 사용하고 첫 번째 필드를 선택합니다.moc
- 마지막으로 다시 뒤집기 위해
com
답변
매개 변수 확장을 사용하십시오. 이것은 훨씬 더 효율적 어떤 외부 명령의 종류보다 cut
(또는 grep
포함).
data=foo,bar,baz,qux
last=${data##*,}
bash의 기본 문자열 조작에 대한 소개는 BashFAQ # 100 을 참조하십시오 .
답변
를 사용하는 것은 불가능합니다 cut
. 사용하는 방법은 다음과 같습니다 grep
.
grep -o '[^,]*$'
다른 분리 문자의 경우 쉼표를 바꾸십시오.
답변
awk없이? … 그러나 awk로 너무 간단합니다.
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK는 주머니에 더 강력한 도구입니다. 필드 구분 기호 NF가 필드 수인 경우 -F (마지막 인덱스도 나타냄)
답변
여러 가지 방법이 있습니다. 이것도 사용할 수 있습니다.
echo "Your string here"| tr ' ' '\n' | tail -n1
> here
분명히 tr 명령의 공백 입력은 필요한 구분 기호로 바꿔야합니다.
답변
이것은 컷 이외의 것을 사용할 수있는 유일한 솔루션입니다.
에코 “문자열”| 컷 -d ‘.’ -f2-
[repeat_following_part_forever_or_until_out_of_memory :] | 컷 -d ‘.’ -f2-
이 솔루션을 사용하면 실제로 필드 수를 알 수 없으며 때때로 달라질 수 있습니다. 그러나 줄 길이는 개행 문자를 포함하여 LINE_MAX 문자 또는 필드를 초과해서는 안되므로 임의의 수의 필드를이 솔루션의 실제 조건으로 포함 할 수 없습니다.
예, 매우 바보 같은 솔루션이지만 내가 생각하는 기준을 충족시키는 유일한 솔루션입니다.
답변
입력 문자열에 슬래시가 포함되어 있지 않으면 basename
서브 쉘을 사용할 수 있습니다 .
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
이것은 사용하지 않는 sed
나 awk
뿐만 아니라 사용하지 않는 cut
내가 확신 그것의 말로으로 질문에 대한 답변으로 자격이 있는지 아니에요, 그래서 하나.
슬래시를 포함 할 수있는 입력 문자열을 처리하는 경우에는 제대로 작동하지 않습니다. 이 상황에 대한 해결 방법은 슬래시를 유효한 입력 문자열의 일부가 아닌 다른 문자로 바꾸는 것입니다. 예를 들어 파이프 ( |
) 문자는 파일 이름에 사용할 수 없으므로 다음과 같이 작동합니다.
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'