【问题标题】:Linux find and replace from command lineLinux 从命令行查找和替换
【发布时间】:2017-03-21 05:45:52
【问题描述】:

我正在寻找一个 linux 命令行脚本来执行以下操作。

假设我有一个文件

ABC|1|READ11|Reading|1
ABj|2|READ11|Reading|2
CBD|3|WRIT11|Reading|3
BCD|4|READ11|Reading|4
CDE|5|WRIT11|Reading|5
CBA|6|READ11|Reading|6

对于以字母'C'开头的每一行,如果它有'WRIT11',则替换为'REPL11'

脚本后的文件

ABC|1|READ11|Reading|1
ABj|2|READ11|Reading|2
CBD|3|REPL11|Reading|3
BCD|4|READ11|Reading|4
CDE|5|REPL11|Reading|5
CBA|6|READ11|Reading|6

【问题讨论】:

    标签: regex linux sed command-line


    【解决方案1】:

    使用这样的东西:

    awk -F'|' '($1 ~ /^C.*$/) && ($3 =="WRIT11")                      \
               {print $1"|"$2"|REPL11|"$4"|"$5; next;}{print;}' file
    

    【讨论】:

    • 你也可以写成:awk 'BEGIN{OFS=FS="|"} $1 ~ /^C/ && $3 == "WRIT11"{$3="REPL11"}1' file
    【解决方案2】:

    可以这样做:

    sed 's/\(^C.*\)WRIT11/\1REPL11/g' your_file
    

    解释:

    s/search_this/replace_it_with_this/gs开头的s是搜索,最后的g是全局的,而不是一行。

    在search_this部分中\(\)内的部分可以写成replace_it_with_this部分中的\1

    ^C 表示行首有一个 C,后面的 . 表示任何字符,* 表示前面的字符不能完全出现或出现多次。

    【讨论】:

    • 或者在没有反向引用的情况下可能更短:sed '/^C/s/WRIT11/REPL11/' file
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2018-12-27
    • 2013-07-21
    • 2014-09-19
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多