Regex 查找/替换目录和Bash脚本

Regex 查找/替换目录和Bash脚本,regex,linux,bash,unix,Regex,Linux,Bash,Unix,我有一些类似的路径: /www/site1.dev/public_html/test.htm /www/site2.dev/html/test.htm /www/site3.dev/public/test.htm /www/site1.dev/public_html/test.htm /www/site2.dev/html/test.htm /www/site3.dev/public/test.htm 我希望将它们传递给bash脚本,并以以下格式返回结果: http://site1.dev/te

我有一些类似的路径:

/www/site1.dev/public_html/test.htm /www/site2.dev/html/test.htm /www/site3.dev/public/test.htm /www/site1.dev/public_html/test.htm /www/site2.dev/html/test.htm /www/site3.dev/public/test.htm 我希望将它们传递给bash脚本,并以以下格式返回结果:

http://site1.dev/test.htm http://site2.dev/test.htm http://site3.dev/test.htm http://site1.dev/test.htm http://site2.dev/test.htm http://site3.dev/test.htm 我不确定处理正则表达式部分的最佳方法是:

#!/bin/sh RET=''; function trim() { echo $1; } for ARG in "$@" do //do match and add existing RET value RET= 'http://'(regular expression or find/replace here) RET done echo ">>$(trim $RET)<<" #!/垃圾箱/垃圾箱 RET=''; 函数trim(){echo$1;} 对于“$@”中的ARG 做 //匹配并添加现有的RET值 RET='http://'(正则表达式或在此处查找/替换)RET 完成
echo“>>$(trim$RET)最简单的方法可能是使用“sed”。即:

RET="http://"`echo $ARG | sed 's#/www##;s#/(public_|)html/#/#;'

假设您的路径在文件中

$ awk 'BEGIN{OFS=FS="/"}{print "http:/"$1,$3,$NF}' file
http://site1.dev/test.htm
http://site2.dev/test.htm
http://site3.dev/test.htm
红宝石(1.9+)


如果您从
www/。

pushd www
find * -type f | while read line; do echo http://${line%%/*}/${line##*/}; done
popd

你能详细说明一下正则表达式是如何工作的吗?什么是www##s#?另外,如果路径在/www/?sed之前有其他未知字符,则允许使用不基于/characters的正则表达式,因此你可以使用#字符绑定可能包含大量/s的表达式。因此,第一个regexp s#/www##repl第二个,s#/(public |)html/#/#将/public_html/或/html/替换为/。我在/www/之前没有处理其他项目,因为它们不在您的示例中。但是您可以向过滤器表达式添加更多内容:s#/foo/bar/path/to/www##也可以。虽然此页面上的所有解决方案都很好,但我认为使用
sed
对我来说效果最好。我添加了语法到问题的底部。
$ ruby -F"/" -ane 'print "http:/"+[$F[0],$F[2],$F[-1]].join("/")' file
command to generate list of pathnames | while read path; do 
  IFS=/
  set -- $path
  echo "http://$3/$5"
done
pushd www
find * -type f | while read line; do echo http://${line%%/*}/${line##*/}; done
popd