추출 Bash에서 문자열의 첫 번째 문자 제거




sed 주석 제거 (4)

필드 구분 기호를 경로 구분 기호로 설정하고 $name 첫 번째 슬래시 앞에있는 내용을 제외한 모든 것을 읽습니다.

while IFS=/ read junk name
do
    echo $name
done < directory_listing.txt

ls 덤프, directory_listing_file 줄에 하나의 문자열 (pathfile) md5sum을 계산해야합니다 :

./r/g4/f1.JPG
./r/g4/f2.JPG
./r/g4/f3.JPG
./r/g4/f4.JPG

그러나 md5sum은 초기 점없이 계산되어야합니다. 간단한 스크립트를 작성했습니다.

while read line
do
    echo $line | exec 'md5sum'
done

./g.sh < directory_listnitg.txt

각 줄에서 첫 번째 점을 제거하려면 어떻게합니까?


Answer #1
myString="${myString:1}"

myString의 문자 번호 1에서 시작하여 (문자 0은 가장 왼쪽 문자 임) 문자열의 나머지 부분을 반환합니다. 문자열의 공백을 허용합니다. 자세한 내용은 $ IFS를 참조하십시오.


Answer #2

sed를 사용하는 다른 접근 방식. 점으로 시작하지 않는 입력을 처리 할 수 ​​있다는 이점이 있습니다. 또한 출력에 개행 문자를 추가하는 echo 문제가 발생하지 않아 md5sum에서 가짜 결과를보고합니다.

#!/bin/bash

while read line
do
     echo -n $line | sed 's/^.//' | md5sum
done < input

다음을 비교하십시오.

$ echo "a" | md5sum
60b725f10c9c85c70d97880dfe8191b3  -

$ echo -n "a" | md5sum
0cc175b9c0f1b6a831c399e269772661  -

Answer #3

다음과 같이 전체 작업을 수행 할 수 있습니다.

% sh -c `sed '[email protected]^.\(.*\)@md5sum \[email protected]' <./dirlist.txt`

정말, 당신이 훨씬 더 효율적으로 만들 수 있다고 생각하지만, 당신의 목록을 생성하는 것이 무엇인지 모르겠습니다. pipe 에서 heredoc 수 있거나 출력을 계속 유지하기 위해 heredoc 을 통해 해당 명령을 실행하면이 전체 작업을 스트리밍 할 수 있습니다.

편집하다:

알았어, 그게 "쓰레기 더미"에서 나온거야. 글쎄, 여기 약간 융통성있는 것이있다.

% ls_dump() {
> sed '[email protected]^.\(.*\)[email protected] \[email protected]' <<_EOF_ | sh -s
>> `ls ${@}`
>> _EOF_
> }
% ls_dump -all -args -you /would/normally/give/ls
<desired output>

나는 이것이 전체적으로 하나의 서브 쉘만을 호출한다고 생각한다. 꽤 괜찮은 find ... -exec md5sum {} ... + 만 필자의 의견으로 find ... -exec md5sum {} ... + 은 아마 더 안전하고 빠르며 필요한 모든 것입니다.

EDIT2 :

좋아, 그럼 이제 사실 질문에 대답 할께. POSIX 호환 쉘에서 문자열의 첫 번째 문자를 제거하려면 다음과 같이 매개 변수를 확장해야합니다.

${string#?}

-마이크





bash