문자열의 첫 단어를 얻는 방법?


43

내가 'echo *' 다음과 같은 출력을 얻을 때 :

file1 file2 file3 ...

내가 원하는 것은 첫 단어를 골라내는 것입니다. 어떻게 진행할 수 있습니까?


1
ls파일 이름 중 하나에 공백이 있으면 @mattdm 사용 이 작동하지 않습니다.
helpermethod

2
단어를 어떻게 정의 합니까? 첫 번째 파일이 파일 이거나 전체 파일 이름 Sunset on a beach.jpg이어야 Sunset합니까? 무엇에 대해 Sea, sex and sun.ogg? Sea, Sea,또는 전체 파일의 이름은?
Stéphane Chazelas

@mattdm ls | head -1a.patch p.py첫 번째 단어가 아니며 알파벳 순서의 파일조차 아닌 임의의 것을 제공합니다 .
phuclv

답변:


52

당신은 awk를 통해 그것을 파이프하고 첫 단어를 에코하게 할 수 있습니다

echo * | head -n1 | awk '{print $1;}'

또는 문자열을 잘라 첫 번째 단어를 선택하십시오.

echo *  | head -n1 | cut -d " " -f1

아니면 sed sugh를 파이프하고 첫 번째 단어를 제외한 모든 것을 제거하도록하십시오.

echo * | head -n1 | sed -e 's/\s.*$//'

| head -n1nitpickers를 만족시키기 위해 를 추가했습니다 . 문자열에 | head -n1줄 바꿈 이 포함 된 경우 중요한 명령이 전달 된 문자열에서 첫 번째 단어를 선택하기 전에 첫 번째 줄을 먼저 선택합니다.


첫 번째 단어가 아니라 모든 줄의 첫 번째 단어를 반환합니다.
Stéphane Chazelas

2
얼마나 많은 라인이 echo *생성 되는지 궁금합니다
Bananguin

그것은 이름에 줄 바꿈 문자가있는 파일 수 또는 환경에 따라 또는 bash가 컴파일 된 방법 또는 목록에 -e또는 -ee... 라는 파일 이 목록에 \n나타나는지, 파일 이름에 몇 시간이 나타나는지에 달려 있습니다 . 라는 파일이 있으면 -n전혀 줄을 반환하지 않을 수도 있습니다.
Stéphane Chazelas

글쎄, 우리는 여전히 bash와 1을 이야기하고 있습니다. 일반적으로 bash는 줄 바꿈이있는 문자열을 줄 바꿈이있는 하나의 문자열로 전달하지 않습니다. 2. 파일 이름에 줄 바꿈이있는 것은 매우 어렵고 특이합니다 (불가능합니까?). 파일 이름은 \ n 4로 표시됩니다. 3은-5로 시작하는 파일 이름을 보유합니다. -n 또는 -e로 호출하더라도 echo는 stdout을 열고 닫으면 물론 줄을 반환합니다. 그 문제에 대한 최소한 하나의 문자열 6. 적어도 여러 줄 문제를 처리하기 위해 내 조언을 편집
Bananguin

1
5 점 모두 거짓입니다. 빈 디렉토리를 사용해보십시오 : touch '$a\nb' 'a\nb'; env BASHOPTS=xpg_echo bash -c 'echo * | wc -l'( 유닉스 호환이 필요한 xpg_echo곳이라면 어디든지 가능 bash합니다). 그리고 다른 빈 디렉토리 : touch ./-n; bash -c 'echo * | wc -l'. 줄은 개행 문자로 끝나는 일련의 문자입니다. 경우 echo출력하지 개행 문자를 않습니다, 그것은 출력하지 라인을 수행합니다. 마지막 개행 문자 다음에 입력에 여분의 문자가 있고 동작이 구현마다 다를 경우 텍스트 유틸리티의 동작은 cut, awk또는 sed지정되지 않습니다.
Stéphane Chazelas

18

posixy shell 가정 ( /bin/sh또는 /bin/bash이것을 할 수 있음)

all=$(echo *)
first=${all%% *}

구문 ${all%% *}부분 문자열 제거 의 예입니다 . 이 변수는 변수의 오른쪽 끝에서 %%가장 긴 일치 항목 *(공백 다음에 오는 것)을 삭제합니다 all. 문자열 조작에 대한 자세한 내용은 여기를 참조하십시오 .

이 솔루션은 구분 기호가 공백이라고 가정합니다. 파일 이름 으로이 작업을 수행하면 공백이 있으면 파일이 손상됩니다.


좋은데 그러나 나는 단순하고 비 핵심적인 다른 버전을 좋아 head했고cut
Anwar

4
IMO, 헤드, 컷 및 sed는 덜 간단합니다. 내장 매개 변수 대체가 작업을 효율적으로 수행 할 때 다른 도구를 생성하는 이유는 무엇입니까? 이 답변은 공백으로 구분 된 단어 목록의 첫 번째 단어 (모든 OP가 요청한 것)를 선택하는 가장 효과적이고 이식성이 좋은 방법입니다.
Juan

7

첫 번째 단어가 아닌 첫 번째 파일 이름 을 정말로 원한다고 가정하면 다음 은 공백에서 벗어나지 않는 방법입니다.

shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"

1
첫 번째 단어도 쉽습니다.files=($(echo *))
Hauke ​​Laging

2
"-n", "-e", "-ne", "-Enenene"... 및 bash컴파일 방법 또는 환경에 따라 백 슬래시 문자에 따라 중단 됩니다.
Stéphane Chazelas

2
@HaukeLaging, globbing을 비활성화해야합니다. : text=$(echo *); set -f; files=($text)그렇지 않으면 더 많은 와일드 카드를 확장 할 수 있습니다.
Stéphane Chazelas

3
files=$(echo *); echo ${files%% *}
vdegenne

1
@memnoch_proxy 공백이 포함 된 파일 이름이 손상되므로주의해서 사용하십시오.
Chris Down

5

위치 매개 변수를 사용할 수 있습니다

set -- *
echo "$1"

3
보조 범위에서 실행하지 않으면 스크립트에 대한 다른 인수가 삭제됩니다. *디렉토리에 파일이없는 경우 에도 확장됩니다 .
Chris Down

shopt -s nullglob그것을 처리 할 것
글렌 잭맨

3

다음 대안 중 하나를 확인하십시오.

$ FILE=($(echo *))
$ FILE=$(echo * | grep -o "^\S*")
$ FILE=$(echo * | grep -o "[^ ]*")
$ FILE=$(find . -type f -print -quit)

그런 다음를 통해 인쇄 할 수 있습니다 echo $FILE.

참조 : grep출력의 유일한 첫 번째 단어를?



1

전체 파일 이름 얻기 :

shopt -s nullglob
printf '%s\000' * | grep -z -m 1 '^..*$'
printf '%s\000' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.