在sed命令中需要帮助来搜索和替换字符串模式

时间:2013-12-03 08:56:00

标签: regex unix sed

我是sed的新手,我正在尝试一些sed表达式:

我有多个文件与模式行:

ABC * 123
ABC * 245
ABC * 456

表示字符串乘以某个整数。

我需要用常数整数

替换所有整数值
ABC * 25
ABC * 25
ABC * 25

我试过:

sed 's/\(ABC\s+\*\s+\)[0-9]+/1 25/g' myfile.txt

但它什么都不做,并返回相同的文件作为输出。

文件也有其他文字。行也有一些其他文本。

4 个答案:

答案 0 :(得分:1)

您的sed方言可能无法理解空白\s和/或+一次或多次重复。你也忘记了反射的反斜杠。

sed 's/\(ABC \+\* \+\)[0-9]\+/\125/g' myfile.txt

这不能处理标签,如果它不接受,您可能不得不摆弄\+

最便携的解决方案可能是使用Perl。

perl -pe 's/(ABC\s+\*\s+)\d+/$125/' myfile.txt

答案 1 :(得分:0)

您可以使用awk

awk '/ABC/ {$3="25"}1' myfile.txt
ABC * 25
ABC * 25
ABC * 25

这是一个更新,可以在行

中的任何位置更改ABC之后的数字
cat file
ABC * 123
sometext ABC * 245
some more ABC * 456 not my text

awk '{for (i=1;i<=NF;i++) if ($i=="ABC") $(i+2)="25"}1' file
ABC * 25
sometext ABC * 25
some more ABC * 25 not my text

gnu awk版本

awk '{print gensub(/(ABC \* )[0-9]+/,"\\125","g")}' file
ABC * 25
sometext ABC * 25
some more ABC * 25 not my text

答案 2 :(得分:0)

sed '/[[:alpnum]][[:space:]]*// s/\([[:space:]]\{1,\}\)[[:digit:]]\{1,}$/\125/' myfile.txt

如果所有行都像样本一样多个

sed 's/\([[:space:]]\{1,\}\)[[:digit:]]\{1,}$/\125/' myfile.txt

答案 3 :(得分:0)

如果您的数字部分始终位于该行的末尾,则可以执行以下操作:

sed -e "s/[0-9]*$/25/"

表示“用25”替换行尾的多个数字

或者如果数字总是被空格包围:

sed -e "s/\s[0-9]*\s/25/"