以及如何在 bash 中用双引号将字符串中的每个单词括起来

and how can i surround each word within a string with double qoutes in bash

这没有用,因为它没有放入 space 并且只在单词 sed -r "s/ /\"/g" didnt work.

的末尾加上一个引号

输入类似 "word1 word2 hello world" 的字符串 我希望得到以下输出:"word1" "word2" "hello" "world"

您可以使用

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"

使用sed

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

使用 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% }" 是要删除尾随 space。

鉴于此字符串存储在名为 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='" "' '{=; print "\"" [=12=] "\""}'
"word1" "word2" "hello" "world"