예를 들면 다음과 같습니다.
USCAGoleta9311734.5021-120.1287855805
다음을 추출하고 싶습니다.
US
예를 들면 다음과 같습니다.
USCAGoleta9311734.5021-120.1287855805
다음을 추출하고 싶습니다.
US
답변:
아마도 가장 효율적인 방법은 bash
셸을 사용하는 경우 (주석에 따르면) 매개 변수 확장의 하위 문자열 변형을 사용하는 것입니다.
pax> long="USCAGol.blah.blah.blah"
pax> short="${long:0:2}" ; echo "${short}"
US
이것은 short
의 처음 두 문자로 설정 됩니다 long
. long
2 자 미만인 경우 short
동일합니다.
이 in-shell 방법은 프로세스 생성 오버 헤드가 없기 때문에 일반적으로 많은 작업을 수행 할 경우 (예 : 보고서 당 50,000 번) 더 좋습니다. 외부 프로그램을 사용하는 모든 솔루션은 이러한 오버 헤드를 겪게됩니다.
또한 최소 길이 를 보장 하려면 다음과 같이 미리 패딩 할 수 있습니다.
pax> long="A"
pax> tmpstr="${long}.."
pax> short="${tmpstr:0:2}" ; echo "${short}"
A.
이렇게하면 길이가 2 자 미만이면 오른쪽에 마침표가 채워집니다 (또는 만들 때 사용 된 문자를 변경하는 것만으로도 다른 것 tmpstr
). 이것이 필요한지는 확실하지 않지만 완전성을 위해 넣을 것이라고 생각했습니다.
하지만 외부 프로그램 (예 : bash
사용할 수 없는 경우)으로이를 수행하는 방법에는 여러 가지가 있으며, 그중 일부는 다음과 같습니다.
short=$(echo "${long}" | cut -c1-2)
short=$(echo "${long}" | head -c2)
short=$(echo "${long}" | awk '{print substr ($0, 0, 2)}'
short=$(echo "${long}" | sed 's/^\(..\).*/\1/')
처음 두 개 ( cut
및 head
)는 한 줄 문자열에 대해 동일합니다. 기본적으로 둘 다 처음 두 문자 만 돌려줍니다. 그들은 cut
각 줄의 처음 두 문자를 제공하고head
의 처음 두 문자를 제공하고 전체 입력의 처음 두 문자를
세 번째는 awk
하위 문자열 함수를 사용하여 처음 두 문자를 추출하고 네 번째는 sed
캡처 그룹 ( ()
및 사용 \1
)을 사용 하여 처음 두 문자를 캡처하고 전체 줄을 이들로 바꿉니다. 둘 다 비슷합니다 cut
. 입력에서 각 줄의 처음 두 문자를 전달합니다.
입력 한 내용이 한 줄이라는 것이 확실하다면 그 어느 것도 문제가되지 않으며 모두 동일한 효과를가집니다.
printf '%s'
대신 echo
: 문자열에 이상한 문자가있는 경우 stackoverflow.com/a/40423558/895245 다음 POSIX의 경우는 집착 head -c
POSIX하지 않습니다, cut -c
그리고 awk substr
이다 sed \1
확실하지.
몇 가지 좋은 답변을 받았으며 Bash 내장을 직접 사용했지만 질문 sed
을 awk
했고 ( 거의 ) 아무도 그에 기반한 솔루션을 제공하지 않았기 때문에 다음을 제공합니다.
echo "USCAGoleta9311734.5021-120.1287855805" | awk '{print substr($0,0,2)}'
과
echo "USCAGoleta9311734.5021-120.1287855805" | sed 's/\(^..\).*/\1/'
awk
하나는 매우 명확한다고하지만, 여기에 대한 설명이다 sed
하나
substr($0,1,2)
.
그냥 grep :
echo 'abcdef' | grep -Po "^.." # ab
-P
옵션을 제거하여 더 짧게 만들 수 있습니다 . 모든 정규식은 그 패턴을 이해할 것입니다.
다음을 사용할 수 있습니다 printf
.
$ original='USCAGoleta9311734.5021-120.1287855805'
$ printf '%-.2s' "$original"
US
셸 스크립팅을 사용하고 비 -posix 확장 (예 : bashisms)에 의존하지 않으려면 grep, sed, cut, awk 등과 같은 외부 도구를 분기 할 필요가없는 기술을 사용할 수 있습니다. 스크립트를 덜 효율적으로 만드십시오. 사용 사례에서 효율성과 posix 이식성이 중요하지 않을 수 있습니다. 그러나 그것이 (또는 좋은 습관처럼) 경우 다음 매개 변수 확장 옵션 방법을 사용하여 쉘 변수의 처음 두 문자를 추출 할 수 있습니다 .
$ sh -c 'var=abcde; echo "${var%${var#??}}"'
ab
이것은 "가장 작은 접두사"매개 변수 확장 을 사용하여 처음 두 문자 (이 ${var#??}
부분)를 제거한 다음 "가장 작은 접미사"매개 변수 확장 ( ${var%
부분)을 사용하여 원본에서 처음 두 문자를 제외한 모든 문자열을 제거합니다. 값.
이 방법은 이전 에 "Shell = Check if variable starts with #"질문에 대한 이 답변 에서 설명했습니다 . 이 답변은 또한 여기에 원래 질문에 적용되는 것과 약간 다른 컨텍스트에서 사용할 수있는 몇 가지 유사한 매개 변수 확장 방법을 설명합니다.
시스템이 다른 셸 (아님 bash
)을 사용하고 있지만 시스템 에이 있는 경우 변수 를 호출 하여 bash
의 고유 한 문자열 조작을 계속 사용할 수 있습니다 .bash
bash
strEcho='echo ${str:0:2}' # '${str:2}' if you want to skip the first two characters and keep the rest
bash -c "str=\"$strFull\";$strEcho;"
재미를 위해 몇 가지를 추가하겠습니다. 비록 너무 복잡하고 쓸모가 없지만 언급되지 않았습니다.
head -c 2 <( echo 'USCAGoleta9311734.5021-120.1287855805')
echo 'USCAGoleta9311734.5021-120.1287855805' | dd bs=2 count=1 status=none
sed -e 's/^\(.\{2\}\).*/\1/;' <( echo 'USCAGoleta9311734.5021-120.1287855805')
cut -c 1-2 <( echo 'USCAGoleta9311734.5021-120.1287855805')
python -c "print(r'USCAGoleta9311734.5021-120.1287855805'[0:2])"
ruby -e 'puts "USCAGoleta9311734.5021-120.1287855805"[0..1]'
mystring = USCAGoleta9311734.5021-120.1287855805 인 경우
print substr(mystring,0,2)
우리를 인쇄 할 것이다
여기서 0은 시작 위치이고 2는 읽는 방법입니다.
awk
. 죄송합니다. 처음에는 말할 수 없었습니다.
이것이 당신의 뒤입니까?
my $string = 'USCAGoleta9311734.5021-120.1287855805';
my $first_two_chars = substr $string, 0, 2;
심판 : substr
perl -e 'print substr $ARGV[0], 0, 2' 'USCAGoleta9311734.5021-120.1287855805'