문자열을 찾고 이전 문자열을 쉼표로 구분하여 가져옵니다.

문자열을 찾고 이전 문자열을 쉼표로 구분하여 가져옵니다.

저는 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/shsedGNU sed를 사용하여 수행되었습니다.

관련 정보