迭代仅由非转义字符分隔的字符串

时间:2018-06-18 15:07:45

标签: regex string bash shell

说我有以下字符串:

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"

在上述条件下产生相同的输出?

3 个答案:

答案 0 :(得分:3)

您可以在gnu grep模式中使用perl

var="One two three\ four five"
grep -oP '[^\s\\]+(\\.[^\s\\]+)*' <<< "$var"

正则表达式详细信息:

  • [^\s\\]+:匹配任何非\
  • 的非空格字符的1+
  • (:启动群组
    • \\.[^\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