文字列を検索し、古い文字列をカンマで区切って取得します。

文字列を検索し、古い文字列をカンマで区切って取得します。

私はUNIXを初めて使用します。

次の目標をどのように達成できますか?

input: text1=ABC/text2=DEF
output: text1,text2

ありがとう

答え1

あなたの質問は、変換したい文字列の構造の面ではそれほど正確ではありません。したがって、あなたの入力機能は次のようになります。

  • KEY=VALUE1行に複数のペアを使用できます。
  • 各ペアは文字で他のペアと区別されます/
  • /ペアの間にのみ配置できます(文字列の開始または終了ではありません)。
  • 連続反復は許可されません/
  • 各ペアでキーできない空ですが、値は空にすることができます(=値が空の場合はオプション)。
  • 各キーと値には=および/または/文字を含めることはできません。

抽出する必要がありますそして、それをカンマで区切って出力します。


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を使用して行われました。

関連情報