考虑以下字符串:
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
答案 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似乎非常有效)