Bash 如何加上「/&引用;如果sed中不存在行的末尾

Bash 如何加上「/&引用;如果sed中不存在行的末尾,bash,sed,Bash,Sed,我正试图想出一个脚本来格式化apache的转发,我需要做的是获取一个url,剥离域,然后在行的末尾附加一个“/”,如果还没有,现在我想出的脚本是: #!/bin/bash sed 's/http:\/\/www.mydomain.co.uk//g' address > address1 sed -e 's/$/\//' address1 > address2 现在,这个脚本将去掉开头的“”,并在结尾添加一个“/”,但是我已经在一些url中添加了“/”。如果“/”不存在,我如何使s

我正试图想出一个脚本来格式化apache的转发,我需要做的是获取一个url,剥离域,然后在行的末尾附加一个“/”,如果还没有,现在我想出的脚本是:

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

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

现在,这个脚本将去掉开头的“”,并在结尾添加一个“/”,但是我已经在一些url中添加了“/”。如果“/”不存在,我如何使sed只添加“/”?

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

sed 's![^/]$!&/!'
为了让事情变得简单一点,我将分隔符从
/
更改为
,这样查找/替换部件中的斜杠就不需要转义。

另一种方法:

$ cat file
abcd/
efgh

$ sed 's:/\?$:/:g' file
abcd/
efgh/
$ 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/

注意事项:

  • 可能适用于您的情况,但需要对
    进行转义以匹配ex:
    s的文本
    |http://www\.mydomain\.co\.uk|g
  • g
    仅当一行中有多个匹配项时才需要标记

    • 无需使用多个命令执行此操作:

      $ 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/
      
      请注意,
      是一个regexp元字符,意思是“任何字符”,因此如果您希望按字面意思处理它,则需要对其进行转义。

      我会简单地执行(无反向引用):
      sed-e的#[^/]$#和/#'