如何使用sed替换字符串

时间:2012-03-21 07:05:21

标签: regex sed

我有一个文本文件,它的数据格式如下:

(1796208919349287,2592294224942165,1527446512828944,'abc','<a href=\'/users/7310739222965755\'>@xxd</a> Hello World!',
(2027149921324245,1612506768201878,2155431015165304,'def','<a href=\'/users/1696908528085920\'>@xyz</a> Would you like to.....?'
........

我愿意从文本文件中删除<a href=\'/users/7310739222965755\'></a>。数据应该是这样的:

(1796208919349287,2592294224942165,1527446512828944,'abc','@xxd Hello World!',
(2027149921324245,1612506768201878,2155431015165304,'def','@xyz Would you like to.....?'
........

我试过的命令是:

sed 's/<a href=\'\/users\/[[:digit:]]{16}\'\/'/ /g' file.sql

但它不起作用。

请指教!

非常感谢!

4 个答案:

答案 0 :(得分:1)

在POSIX标准sed中,您需要使用\{16\}来包含计数。

您还需要非常小心单引号。要在shell中的单引号字符串中嵌入单引号,您需要使用序列:

'\''

第一个引号结束当前单引号字符串;反斜杠引用嵌入单引号;然后最后一个单引号恢复单引号字符串。你还需要注意字符串中的反斜杠;它们对sed(以及shell)有意义。

这导致:

sed -e 's/<a href=\\'\''\/users\/[[:digit:]]\{16\}\\'\''>/ /g' \
    -e 's/<\/a>/ /g' \
    file.sql

警告:未经测试的脚本。

答案 1 :(得分:1)

您需要为初学者添加更多转义功能。这是一个工作版本:

sed -e "s/<a href\=\\\'\/users\/[[:digit:]]\{16\}\\\'>\([^<]*\)<\/a>/\1/g"

除非你有特殊的理由使用sed,否则我建议使用perl,因为需要更少的转发

cat test.txt | perl -pe "s/<a href=\\\'\/users\/\d{16}\\\'>([^<]*)<\/a>/\1/g"

答案 2 :(得分:0)

这可能对您有用:

sed 's/<a href[^>]*>\([^<]*\)<\/a>/\1/' file
(1796208919349287,2592294224942165,1527446512828944,'abc','@xxd Hello World!',
(2027149921324245,1612506768201878,2155431015165304,'def','@xyz Would you like to.....\uff1f'
.......

答案 3 :(得分:0)

如果要删除所有xml标记:

sed 's/<[^>]*>//g'