说我有以下字符串:
var="One two three\ four five"
什么命令会有以下代码:
for item in "$(operation on $var)"; do
echo "$item"
done
并产生以下输出:
One
two
three four
five
或者,我可以使用单引号在已经用双引号括起来的字符串输入上实现这一点吗?即,我可以使用字符串
var="One two 'three four' five"
在上述条件下产生相同的输出?
答案 0 :(得分:3)
您可以在gnu grep
模式中使用perl
:
var="One two three\ four five"
grep -oP '[^\s\\]+(\\.[^\s\\]+)*' <<< "$var"
正则表达式详细信息:
[^\s\\]+
:匹配任何非\
(
:启动群组
\\.[^\s\\]+
:匹配\
后跟任何转义字符,后跟另一个包含1 +非空格和非反斜杠字符的字符串。 )*
:结束组。匹配此组中的0个或更多。
One
two
three\ four
five
以下是同一grep
的 posix版本:
grep -oE '[^\\[:blank:]]+(\\.[^\\[:blank:]]+)*' <<< "$var"
如果你想循环遍历这些字符串:
while IFS= read -r str; do
echo "$str"
done < <(grep -oP '[^\s\\]+(\\.\S+)*' <<< "$var")
答案 1 :(得分:1)
只是为了延伸anubhava对第一种情况(Response [http://www.compbio.dundee.ac.uk/jpred4/cgi-bin/rest/job]
Date: 2018-06-18 15:28
Status: 415
Content-Type: text/html; charset=ISO-8859-1
Size: 82 B
)的彻底回答,这是第二种情况("\ "
)的答案:
"' '"
输出:
echo "one two 'three four three and a half' five" |
grep -oE "('([^'[:blank:]]+ )+[^'[:blank:]]+'|[^'[:blank:]]+)"
答案 2 :(得分:-1)
使用数组:
arr=(one two 'three four' five)
for item in "${arr[@]}" ; do
echo "$item"
done