shell 使用bash将字符串中的每个单词用字符括起来

cgh8pdjw  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(228)

目标

我尝试创建一个函数,它将字符串作为参数,用双引号将字符串中的每个单词括起来,并将其作为字符串返回。

已尝试

我尝试的是下面的sed代码段,但它输出的是用双引号括起来的整个字符串,而不是每个单词。sed -r "s/ /\"/g"

预期

function wordWrapper {
  # Do some magic here
}

var = wordWrapper "Hello World"
echo $var

应输出"Hello" "World"

bfnvny8b

bfnvny8b1#

使用printf的纯bash解决方案,不需要任何正则表达式或外部工具:

s="word1 word2 hello world"
set -f
printf -v r '"%s" ' $s
set +f

echo "$r"
"word1" "word2" "hello" "world"

PS:如果你想删除尾部空格,请使用echo "${r% }"

juud5qan

juud5qan2#

您可以使用

sed 's/[^[:space:]]*/"&"/g' file > newfile
sed -E 's/[^[:space:]]+/"&"/g' file > newfile

在第一个POSIX BRE模式中,[^[:space:]]*匹配零个或多个除空格字符之外的字符,并且"&"用双引号括住自身来替换匹配。在第一个POSIX ERE模式中,[^[:space:]]+匹配一个或多个除空格之外的字符。
请参阅online demo

#!/bin/bash
s="word1 word2 hello world"
sed -E 's/[^[:space:]]+/"&"/g' <<< "$s"
# => "word1" "word2" "hello" "world"
sed 's/[^[:space:]]*/"&"/g' <<< "$s"
# => "word1" "word2" "hello" "world"
hs1rzwqc

hs1rzwqc3#

使用sed

$ echo "word1 word2 hello world" | sed 's/\S\+/"&"/g'
"word1" "word2" "hello" "world"
polkgigr

polkgigr4#

给定存储在名为instr的变量中的以下字符串:

$ instr='word1 word2 hello world'

您可以:

$ read -r -a array <<< "$instr"
$ printf -v outstr '"%s" ' "${array[@]}"
$ echo "${outstr% }"
"word1" "word2" "hello" "world"

或者如果您愿意:

$ echo "$instr" | awk -v OFS='" "' '{$1=$1; print "\"" $0 "\""}'
"word1" "word2" "hello" "world"

相关问题