如果使用sed存在给定字符串,则替换字符串中的单词

时间:2014-12-17 13:53:30

标签: string sed

考虑以下字符串:

function 12345 filename.pdf 6789 12
function 12345 filename.doc 7789 4567

有没有办法使用sed搜索字符串以查看它们是否包含pdf或doc子字符串,并将字符串替换为以下字符串?

function_pdf 12345 filename.pdf 6789 12
function_doc 12345 filename.doc 7789 4567

5 个答案:

答案 0 :(得分:1)

使用sed:

~$ cat i.txt
function 12345 filename.pdf 6789
function 12345 filename.doc 7789
function 12345 filename.txt 8888
~$ sed -e 's/\(function\) \(.*\)\(pdf\|doc\)\(.*\)/\1_\3 \2\3\4/' i.txt
function_pdf 12345 filename.pdf 6789
function_doc 12345 filename.doc 7789
function 12345 filename.txt 8888

使用所需的正则表达式捕获扩展程序,然后使用\x表示法将其插入所需的位置。
来自man sed:

  

特殊转义\ 1到\ 9引用正则表达式中相应的匹配子表达式。

答案 1 :(得分:1)

你真的没有充分说明问题,但也许你正在寻找:

sed -e  '/\.pdf/s/function/function_pdf/g' -e /\.doc/s/function/function_doc/g'

答案 2 :(得分:1)

通过sed,

$ sed 's/^\([^[:space:]]\+\)\( [^[:space:]]\+ [^[:space:]]\+\.\)\(pdf\|doc\)/\1_\3\2\3/g' file
function_pdf 12345 filename.pdf 6789 12
function_doc 12345 filename.doc 7789 4567

答案 3 :(得分:0)

使用awk:

awk '$1=="function" && ($3 ~ /\.(pdf|doc)$/) {$1=$1 "_" substr($3,length($3)-2)}7'

答案 4 :(得分:0)

sed 's/\( .*\.\)\([^ ]*\)\(.*\)/_\2&/' YourFile

我发现的最简单的sed(sed似乎非常有效)