我是 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/sh
并sed
使用 GNU sed 完成的。