【问题标题】:Match and replace digits with sed in specific lines在特定行中用 sed 匹配和替换数字
【发布时间】:2013-07-31 07:38:12
【问题描述】:

使用 Ubuntu 12.04 和 vim 2.22.0,在 vim 编辑器中我将使用:

:9;13;17;21s/\d\+/1/

匹配 ^M 之前的数字(有时只是没有任何尾巴的数字)并将它们更改为 1。这种模式仅出现在第 #9、13、17 和 21 行的开头。即:

vi _ccc_info_datasets:

...
=====
2
../../automotive_susan_data/2.pgm output_large.corners.pgm -c > ftmp_out
691^M  // ---------> change to 1^M
=====
...

据我了解,sed 不能像这样:

find . type f  -name "_ccc_info_datasets" -exec sed -i '9;13;17;21s/\d\+/1/' {} \;

用于更改 bash 中的多个文件。我试过了:

find . type f  -name "_ccc_info_datasets" -exec sed -i '9;13;17;21s/[0-9]{1;\}/1/' {} \;

但它执行时没有错误但没有结果。任何帮助表示赞赏;)

【问题讨论】:

    标签: bash replace sed awk pattern-matching


    【解决方案1】:

    你不能那样使用 sed。您需要使用多个带有 -e 开关的 sed 替换,如下所示:

    sed -i.bak -e '9s/[0-9][0-9]*\('$'\r''\)/1\1/' -e '13s/[0-9][0-9]*\('$'\r''\)/1\1/' \
        -e '17s/[0-9][0-9]*\('$'\r''\)/1\1/' -e '21s/[0-9][0-9]*\('$'\r''\)/1\1/' file
    

    更新:虽然 awk 不支持内联编辑,但我相信使用 awk 会更清晰地完成这项任务。请考虑以下 awk 命令:

    awk 'NR ~ /^9|13|17|21$/{sub(/[0-9]+\r$/, "1\r")}1' file > _temp && mv _temp file
    

    【讨论】:

    • tnx @anubhava 为答案。但是,通过执行这些 sed -e,我在数字之后丢失了尾端“^M”字符,其次,因为它不会是内联的(sed -i),所以我在屏幕上接收输出而不是保存在里面文件。
    • 您可以在上面插入-i,它不会删除^M,因为我在\1 中捕获它并在替换字符串中使用它:1\1
    • tnx @anubhava,这很有效! ;)
    • 很高兴知道它的工作。如果此回答帮助您解决了问题,请考虑将其标记为“已接受”,以便日后遇到类似问题的用户能够轻松查看。
    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多