2014-07-13 3 views
0

임이 디렉토리 안의 각 파일과 폴더를 반복하고 파일 이름의 일부를 변수로 추출하려고 시도하지만 올바르게 sed 작업을 수행 할 수 없습니다. 나는 파일 이름을 모두 얻었거나 모두 가져 오지 않았다.OS X에서 sed를 사용하여 부분 문자열을 추출하는 방법은 무엇입니까?

전체 파일 이름을 캡처해야 스크립트 버전 :

#!/bin/bash 
for f in * 
do 
    substring=`echo $f | sed -E -n 's/(.*)/\1/'` 
    echo "sub: $substring" 
done 

하지만 그 대신 내가 할을 아무것도 :

sub: 
sub: 
sub: 
sub: 
... 

이 버전은 파일 이름에 나에게 단지 첫 번째 문자를 제공해야합니다 :

#!/bin/bash 
for f in * 
do 
    substring=`echo $f | sed -E 's/^([a-zA-Z])/\1/'` 
    echo "sub: $substring" 
done 

하지만 그 대신 나는 전체 파일 이름을 가져 :

sub: Adlm 
sub: Applications 
sub: Applications (Parallels) 
sub: Desktop 
... 

나는 수많은 그것의 반복하고 무엇을 기본적으로 내가 -n를 사용하는 경우 내가 아무것도 얻을 내가하지 않으면 내가 전체 파일 이름을 가져올 수 있다는 것입니다 귀결을 시도했습니다.

다른 사람이 나에게 첫 번째 캐릭터를 가져 오는 방법을 보여줄 수 있습니까?

또는 내 전반적인 목표는 하위 문자열을 추출하여 변수에 저장할 수있게하는 것입니다. 누구에게나 더 나은 방법이 있다면 그 점도 인정할 것입니다.

미리 감사드립니다.

+0

나는 sed 대신에 grep -o를 원한다고 생각한다 – FDinoff

+1

오래되고 구식 인 backtics를 사용하면 안된다. 다음과 같이 괄호를 사용하십시오. var = $ (code) – Jotne

+0

왜 내 질문에 투표가 내려 졌습니까? 미래의 실수를 피할 수 있도록 부탁드립니다. – cutmancometh

답변

1

전체 파일 이름을 캡처해야 스크립트 버전 :

나오지 -E -n의 /을 (.*)/\ 1/'

대신에 나는 아무 것도 얻지 못합니다.

-n을 사용 했으므로 아무 것도 산출하지 않습니다. 아마 당신은 -n를 제거하거나 추가 p을해야합니다

sed -E -n 's/(.*)/\1/p' 

이 버전은 파일 이름에 나에게 단지 첫 번째 문자를 제공해야합니다 : 나오지

-E의/^ ([A-ZA-Z ])/\ 1/'

하지만 그 대신 내가 전체 파일 이름을 가져,

당신은 담당자하지 않았다 거기 뭐든지 레이스 해.

substring=`echo "$f" | sed ...'` 

마지막으로 간단한 방법은 kojiro에 의해 제안 당신이 배쉬를 사용하는 경우 하위 문자열 확장을 사용하는 것입니다 : 아마도 당신이 원한

sed -E 's/^([a-zA-Z]).*/\1/' 

또한 나는 당신의 주장을 인용 제안했다.

+0

고맙습니다. 문제는 내가 캡쳐 그룹 후에. *를 놓쳤다는 것이 었습니다. 이것은 또한 다른 사람들에 의해 지적되었지만 당신이 가장 완전한 대답을했기 때문에 체크 표시를했습니다. – cutmancometh

1

당신은 나오지도에서 캡처 그룹 후 .*을 추가하는 것을 잊지,

$ for i in *; do substring=`echo $i | sed -E 's/^(.).*$/\1/'`; echo "sub: $substring"; done 

그것은 첫 번째 문자는 특수 문자로 시작하는 경우 실패 할 수 있기 때문에 . 대신 [a-zA-Z]을 사용하는 것이 좋습니다.

+0

이 문제가 해결되었습니다. 고맙습니다. – cutmancometh

+0

구식과 구형 이언어는 사용하지 마십시오. 다음과 같이 괄호를 사용하십시오.'var = $ (code)' – Jotne

+0

@Jotne 나는 알고 있습니다. 누군가는 OSX은'$()'을 지원하지 않을 것이라고 말했다. –

4

쉘 매개 변수를 수정하려면 매개 변수 확장을 사용하는 것이 좋습니다.

for f in *; do 
    # This version should expand to the whole parameter 
    echo "$f" 
    # This version should expand to the first character in the filename 
    echo "${f::1}" 
done 

매개 변수 확장은 sed만큼 강력하지,하지만 그들은 쉘에 내장되어 있습니다 (아무는 별도의 프로세스를 시작하거나 필요한 서브 쉘) 및 확장이 거기에 있습니다 : 위와 같이 (

  1. 하위 문자열)
  2. 교체 및 대체 문자
  3. 문자열의 경우를 변경 (bash는 4+)

이상.

+0

감사합니다. 알고 계셔서 감사합니다. 하지만 현재의 문제에 관해서는 정규식을 사용하여 파일 이름의 특정 비트를 가져 오는 방법을 알아야합니다. 이 예제에서는 파일 이름의 첫 글자를 사용했습니다. 왜냐하면 정말 간단한 정규 표현식을 사용했기 때문에 문제를 가장 단순한 형태로 압축하고 싶었 기 때문입니다. 그러나 다음에 색인으로 하위 문자열이 필요하면 이것을 사용할 것입니다. – cutmancometh

1

나는 sed를 선호합니다. 내가 이해하기가 더 쉬운 것 같다.

#!/bin/bash 
#set -x 
for f in * 
do 
    substring=`echo $f | awk '{print substr($1,1,1)}'` 
    echo "sub: $substring" 
done 
+0

구식과 구형 이언어는 사용하지 마십시오. 다음과 같이 괄호를 사용하십시오.'var = $ (code)' – Jotne

관련 문제