使用shell命令替换常量开始和结束字符串之间的随机文本

时间:2014-02-10 21:22:27

标签: shell sed awk

如何使用shell将:50K:53B中的CREDIT{:32tyfddf:65 trfdfd :67 ghfdfd :50K:xxxxhh:53B:fg :43:fg $ {:32tyfddf:65 trfdfd :67 ghfdfd :50K:yyyyhh:53B:fg :43:fg $ {:32tyfddf:65 trfdfd :67 ghfdfd :50K:zzzzz:53B:fg :43:fg $ 之间的随机文本替换为{{1}}?

输入

{{1}}

3 个答案:

答案 0 :(得分:1)

 sed 's/:50K.*:53B/:50KCREDIT:53B/g'

基本的sed替换表达式:

s/what_to_look_for/what_to_replace_with/

g表示“为线上所有找到的模式执行此操作”(您可能希望跳过该模式)。

<强>用法: 您可以通过让它从stdin中读取来使用sed:

 cat path/to/your_text_file | sed 's/:50K.*:53B/:50KCREDIT:53B/g'

或通过将要替换的文本文件作为参数提供

 sed 's/:50K.*:53B/:50KCREDIT:53B/g' path/to/your_text_file

每个人都会将替换版本打印到stdout。也不会修改原始文件。

答案 1 :(得分:1)

使用Perl:

perl -pi.bak -e 's/(\:50K).+?(\:53B)/${1}CREDIT${2}/g;' input_file

基本用法:

s/replace_this/with_this/g;
(\:50K)部分中的{p> (\:53B)replace this位于括号内,因为这些是所谓的捕获组。您可以在${1}部分,${2}中将这些捕获组称为\1\2(或with_thisCREDIT)作为字面替换中间的任何内容(.+?(\:53B) - 表示任何字符,无论出现多少次,直到出现53B)。

:被转义,因为它是正则表达式中的元字符。

文件备份将保存到input_file.bak

使用您的输入,输出为:

$ cat input_file
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $

希望它有所帮助。

答案 2 :(得分:1)

使用awk

awk -F":50K|:53B" '{$2=":50KCREDIT:53B"}8' OFS="" file
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $

awk '{sub(/:50K.*:53B/,":50KCREDIT:53B")}8' file
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $

gnuawk

awk '{print gensub(/(:50K).*(:53B)/,"\\1CREDIT\\2","g")}' file
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $
{:32tyfddf:65 trfdfd :67 ghfdfd :50KCREDIT:53B:fg :43:fg $