1

使用 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/' {} \;

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

4

1 回答 1

0

你不能像那样使用 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
于 2013-07-31T09:13:12.700 回答