저는 UNIX를 처음 사용합니다.
다음 목표를 어떻게 달성할 수 있나요?
input: text1=ABC/text2=DEF
output: text1,text2
감사해요
답변1
귀하의 질문은 변환하려는 문자열의 구조 측면에서 그다지 정확하지 않습니다. 따라서 귀하의 입력 기능은 다음과 같습니다.
KEY=VALUE
한 줄에 여러 쌍을 사용할 수 있습니다.- 각 쌍은 문자로 다른 쌍과 구분됩니다
/
. /
쌍 사이에만 배치할 수 있습니다(문자열의 시작이나 끝이 아님).- 연속적인 반복은 허용되지 않습니다
/
. - 각 쌍에서 키는할 수 없다비어 있지만 값은 비어 있을 수 있습니다(
=
값이 비어 있는 경우 선택 사항). - 각 키와 값은
=
및/또는/
문자를 포함할 수 없습니다.
추출해야합니다열쇠, 그런 다음 쉼표로 구분하여 출력합니다.
Sed 기반 방법(부정행위)
sed
이는 줄 기반 검색/바꾸기 작업을 통해 입력을 실행하는 스크립트로 수행할 수 있습니다.
sed 's/=[^/]*//g;y/\//,/'
- 번역하다:모든 인스턴스 삭제
=
/
연속된 비문자 와 함께;그런 다음/
모든 문자를 쉼표로 바꿉니다.
샘플 코드는 다음과 같습니다(GNU Bash뿐만 아니라 모든 POSIX 셸에서 실행되어야 함).
#!/bin/sh
# This is ssv-keys-sed.sh
echo -n "input: "
IFS= read -r INPUT
echo -n "output: "
echo "$INPUT" | sed 's/=[^/]*//g;y/\//,/'
예제를 실행하세요:
$ sh ssv-keys-sed.sh
input: keyA=valueA/ k e y B =/keyC/keyD=valueD
output: keyA, k e y B ,keyC,keyD
쉘 스크립트 방식(완전 분석)
이 작업을 수행하기 위해 쉘 스크립트 기반 접근 방식을 사용하려는 경우분석하다위의 대체 기반 치트 대신 IFS
단어 구분 변수와 루프를 사용할 수 있습니다 . for
확실히하다다른 맥락에서 인용하는 것에 주의하세요. 이는 프로그램의 성공이나 실패에 영향을 미칠 수 있습니다., 쉘의 내부 단어 구분 기호를 수정하고 있기 때문입니다.
- 따옴표 없이 쉘 스크립트 변수를 사용하는 경우 해당 값은 변수에 지정된 구분 기호로 분할된
IFS
다음 여러 토큰으로 분할됩니다. - 쉘 스크립트 변수를 묶는 경우더블인용 시 그 값은 분할되지 않고 전체적으로 사용됩니다.
- 쉘 스크립트 변수를 묶는 경우하나의인용된 경우 변수로 처리되지 않습니다. 작은따옴표 안에 작성된 내용은 문자 그대로 간주됩니다.
다음 스크립트는 GNU Bash뿐만 아니라 모든 POSIX 셸에서 실행되어야 합니다.
#!/bin/sh
# This is ssv-keys-parse.sh
# Show input prompt
echo -n "input: "
# Read one line from standard input into variable INPUT,
# no parsing or escape-processing
IFS= read -r INPUT
# Prepare empty output variable OUTPUT
OUTPUT=""
# Set parsing separator for extracting pairs
IFS="/"
# Extract each pair
# ^ Note that all pairs will be extracted before the loop is run,
# so separator set inside the loop won't effect pairs extraction.
for PAIR in $INPUT
do
# Set parsing separator for extracting key
IFS="="
for KEY in $PAIR
do
# Stop at the first split part of key-value pair (i.e. key)
break
done
# If this is not the first key in the output, append comma to the output
if [ -n "$OUTPUT" ]
then
OUTPUT="$OUTPUT,"
fi
# Append the extracted key to the output
OUTPUT="$OUTPUT$KEY"
done
# Emit output
echo "output: $OUTPUT"
예제를 실행하세요:
$ sh ssv-keys-parse.sh
input: keyA=valueA/ k e y B =/keyC/keyD=valueD
output: keyA, k e y B ,keyC,keyD
PS 내 테스트 실행은 설치된 Debian Almquist Shell /bin/sh
과 sed
GNU sed를 사용하여 수행되었습니다.