我不擅长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
。
答案 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
实施。
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)变量中断换行而不是空格。
从上面的链接中拉出一个例子:
#!/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