如何将带有嵌入空格的未加引号的路径列表拆分为单独的路径?

时间:2014-06-19 02:25:19

标签: string bash shell divide

我不擅长Ubuntu中的bash shell脚本,所以我需要你的帮助。

问题是......

我们使用Perforce for SCM。

我尝试从//Development/分支机构获取目录。

直到这个时候,一切都很好。

但是现在我不能再按空格分割分支,因为分支如下(注意嵌入空间):

//Development/graphic/release/Unity Provider

我们需要在以//Development开头的单独行上的每个分支,但总是得到以下结果(请注意不需要的换行符):

//Development/graphic/release/Unity
Provider

我该如何解决这个问题?

请帮帮我。 谢谢。

下面是一个单行字符串示例:

//Development/graphic/release/CM //Development/graphic/release/GManager //Development/graphic/release/Notification //Development/graphic/release/Core //Development/graphic/release/Provider //Development/graphic/release/WH //Development/graphic/release/Accessory //Development/graphic/release/Unity Provider //Development/graphic/release/tipManager

而且,我想得到一个如下所示的结果字符串(每个分支名称在它自己的行上):

//Development/graphic/release/CM 
//Development/graphic/release/GManager 
//Development/graphic/release/Notification 
//Development/graphic/release/Core 
//Development/graphic/release/Provider 
//Development/graphic/release/WH 
//Development/graphic/release/Accessory 
//Development/graphic/release/Unity Provider 
//Development/graphic/release/tipManager

我还想将结果存储在列表变量中。

例如,list[0]应包含//Development/graphic/release/CM

3 个答案:

答案 0 :(得分:1)

我假设:

  • 您希望根据以//[Development/]开头的子字符串将输入字符串拆分为单独的路径,或者在字符串的开头,或者如果在内部,则以单个空格开头。
  • 无论//[Development/]个实例之间的字符串是否包含空格。
str='//Development/graphic/release/CM //Development/graphic/release/GManager //Development/graphic/release/Notification //Development/graphic/release/Core //Development/graphic/release/Provider //Development/graphic/release/WH //Development/graphic/release/Accessory //Development/graphic/release/Unity Provider //Development/graphic/release/tipManager'    

echo "$str" | sed 's# \(//\)#\'$'\n''\1#g'

以上内容适用于任何与POSIX兼容的sed实施。

使用command substitution

捕获变量中的输出
result=$(echo "$str" | sed 's# \(//\)#\'$'\n''\1#g')

如果您想逐行处理结果:

while read -r path; do echo "$path"; done <<<"$result"

sed命令的说明:

  • #被 - 任意选择 - 作为sed的{​​{1}}(字符串替换)命令的分隔符,以便更容易匹配s字符(通常) ,/用作分隔符,这需要/ - 在正则表达式和替换字符串中转义\个实例。
  • 如果前面有空格,则
  • /匹配 \(//\)
  • //使用ANSI C引用有效地将换行符(\'$'\n'')插入到替换字符串中(OSX兼容性需要;在Linux上,\n只会这样做。)
  • \n从正则表达式中插入第一个(也是唯一一个)捕获组,即\1
  • //确保匹配为全局,即匹配正则表达式的所有子字符串将被替换。

结果:

g

答案 1 :(得分:0)

使用内部字段分隔符(IFS)变量中断换行而不是空格。

这很好地解释了: http://mindspill.net/computing/linux-notes/using-the-bash-ifs-variable-to-make-for-loops-split-with-non-whitespace-characters/

从上面的链接中拉出一个例子:

#!/bin/bash
IFS=$','
vals='/mnt,/var/lib/vmware/Virtual Machines,/dev,/proc,/sys,/tmp,/usr/portage,/var/tmp'
for i in $vals; 
     do echo $i; 
done
unset IFS

答案 2 :(得分:0)

你也可以尝试这个awk命令,

$ awk -v RS=" //" '{gsub (/^D/,"//D");}1' file
//Development/graphic/release/CM
//Development/graphic/release/GManager
//Development/graphic/release/Notification
//Development/graphic/release/Core
//Development/graphic/release/Provider
//Development/graphic/release/WH
//Development/graphic/release/Accessory
//Development/graphic/release/Unity Provider
//Development/graphic/release/tipManager