新手问题 关于一个 Sed 命令的,谁能来解释一下

kakaxi2 · 2015年09月15日 · 最后由 schwinn 回复于 2015年09月15日 · 2404 次阅读

需要写一个下载网页图片的 shell 脚本,网上看到一个例子,但是对于如下的这条 sed 命令,其表达的意思, 谁能来解释一下:

sed -i "s|^/|$baseurl/|" /tmp/$$.list

把行首的 / 替换成 $baserurl/

没有上下文, $baseurl 可能是个变量

#1 楼 @leopku 整个的脚本如下:

#!/bin/bash
if [ $# -ne 3 ];
then
 echo "Usage: $0 URL -d DIRECTORY"
 exit -1
fi

for i in {1..4}
do
 case $1 in
 -d) shift; directory=$1; shift;;
    *) url=${url:-$1};shift;
esac
done

mkdir -p $directory
baseurl=$(echo $url | egrep -o "https?://[a-z.]+")

echo "$baseurl"

curl -s $url | egrep -o "<img src=[^>]*>" |
sed 's/<img src=\"\([^"]*\).*/\1/g' > /tmp/$$.list

sed -i "s|^/|$baseurl/|" /tmp/$$.list
cd $directory;

while read filename
do
 curl -s -O "$filename" --silent
done < /tmp/$$.list

首先把 img src 的值当中第一个"/"之前的内容全去掉,然后再在前面加上 baseurl

#3 楼 @crazyjacky sed 里面一般见到的都是 s///g 模式,怎么还有 s|||g 这样的模式啊?

@kakaxi2 s///g使用前提是 /没有被中间的内容使用否则就乱了,若/被使用了 可以把 s///g写成s###g,s@@@g等等

#5 楼 @schwinn 刚看了一下手册:The syntax of the s (as in substitute) command is‘s/regexp/replacement/flags’. The / characters may be uniformly replaced by any other single character within any given s command. The / character (or whatever other character is used in its stead) can appear in the regexp or replacement only if it is preceded by a \ character. 所以应该是以 s 后面的字符作为分隔符

对,分隔符 是可以自定义的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号