如果sed不存在,如何将“/”添加到行尾

时间:2016-11-18 14:11:10

标签: bash sed

我正在尝试编写一个脚本来格式化apache的转发,我需要做的是取一个url,剥离域然后在行的末尾附加一个“/”如果没有一个已经有了,现在我提出的脚本就是:

#!/bin/bash
sed 's/http:\/\/www.mydomain.co.uk//g' address > address1

sed -e 's/$/\//' address1 > address2

现在这个脚本将在开头取消“http://www.mydomain.co.uk”并在结尾添加一个“/”,但是其中一些网址已经有了“/”。如果它还没有那么我怎么才能加上“/”?

4 个答案:

答案 0 :(得分:4)

在该行末尾匹配斜杠以外的字符,并将其替换为匹配(&)加斜杠:

sed 's![^/]$!&/!'

为了让事情变得更容易,我将分隔符从/更改为!,以便查找/替换部分中的斜杠不需要转义。

答案 1 :(得分:1)

$ cat file
abcd/
efgh

$ sed 's:/\?$:/:g' file
abcd/
efgh/

答案 2 :(得分:1)

另一种方法:

objDate=year(now)

也可以组合多个命令:

$ echo 'http://www.mydomain.co.uk' | sed '/\/$/! s|$|/|'
http://www.mydomain.co.uk/

$ echo 'http://www.mydomain.co.uk/' | sed '/\/$/! s|$|/|'
http://www.mydomain.co.uk/


备注:

  • 可能会针对您的案例工作,但$ echo 'http://www.mydomain.co.uk/abc' | sed 's|http://www.mydomain.co.uk||g; /\/$/! s|$|/|' /abc/ $ echo 'http://www.mydomain.co.uk/abc/' | sed 's|http://www.mydomain.co.uk||g; /\/$/! s|$|/|' /abc/ 需要转义以匹配文字.,例如:.
  • 仅当行中有多个匹配时才需要
  • s|http://www\.mydomain\.co\.uk||g标志

答案 3 :(得分:1)

没有必要使用多个命令执行此操作:

$ cat file
http://www.mydomain.co.uk/foo/
http://www.mydomain.co.uk/bar

$ sed 's#http://www\.mydomain\.co\.uk\(.*[^/]\).*#\1/#' file
/foo/
/bar/

请注意,.是一个正则表达式元字符,意思是“任何字符”,因此如果您希望对它进行字面处理,则需要将其转义。