查找一个字符串并获取以逗号分隔的前一个字符串

查找一个字符串并获取以逗号分隔的前一个字符串

我是 UNIX 新手。

我如何实现以下目标

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

谢谢

答案1

就您要转换的字符串的结构而言,您的问题不是很准确。所以我猜测你的输入特征是:

  • KEY=VALUE单行提供多对。
  • 每对将通过字符与其他对分开/
  • /只能放置在对之间(不能放置在字符串的开头或结尾)。
  • 不允许连续重复/
  • 在每对中,密钥不能为空,但 value 可以为空(=如果 value 为空,则为可选)。
  • 每个键和值不能包含=and/or/字符。

你需要提取,然后输出它们,用逗号分隔...


基于 Sed 的方法(作弊)

sed这可以通过您的脚本通过基于一行的搜索/替换操作运行您的输入来完成:

sed 's/=[^/]*//g;y/\//,/'
  • 翻译:删除所有实例=连同/其后的连续非字符;然后,/用逗号替换所有字符。

示例代码如下(应该在任何 POSIX shell 上运行,而不仅仅是 GNU Bash):

#!/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

Shell脚本方法(完整解析)

如果您坚持使用基于 shell 脚本的方法来执行此操作解析您可以使用IFS单词分隔符变量和for循环,而不是上面基于替换的作弊。务必注意不同上下文中的引用(以及不引用);这可能会影响程序的成败,因为我们正在修改 shell 的内部单词分隔符。

  • 如果您使用不带引号的 shell 脚本变量,则其值将被变量中指定的分隔符分割IFS,然后作为多个标记。
  • 如果您将 shell 脚本变量括起来双倍的引用时,其值将作为整体使用,而不是拆分。
  • 如果您将 shell 脚本变量括起来单身的引用,它不会被视为变量;单引号内写的所有内容都将按字面意思理解。

以下脚本应该在任何 POSIX shell 上运行,而不仅仅是 GNU Bash...

#!/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/shsed使用 GNU sed 完成的。

相关内容