私はUNIXを初めて使用します。
次の目標をどのように達成できますか?
input: text1=ABC/text2=DEF
output: text1,text2
ありがとう
答え1
あなたの質問は、変換したい文字列の構造の面ではそれほど正確ではありません。したがって、あなたの入力機能は次のようになります。
KEY=VALUE
1行に複数のペアを使用できます。- 各ペアは文字で他のペアと区別されます
/
。 /
ペアの間にのみ配置できます(文字列の開始または終了ではありません)。- 連続反復は許可されません
/
。 - 各ペアでキーできない空ですが、値は空にすることができます(
=
値が空の場合はオプション)。 - 各キーと値には
=
および/または/
文字を含めることはできません。
抽出する必要があります鍵そして、それをカンマで区切って出力します。
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を使用して行われました。