【发布时间】:2017-12-20 17:22:49
【问题描述】:
我有包含以下文本(以及其他文本)的文本文件
DIFF_COEFF= 1.000e+07,1.000e+07,1.000e+07,1.000e+07,
1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,
1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,
1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,
1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,
1.000e+07,1.000e+07,1.000e+07,1.000e+07,1.000e+07,4.000e+05,
我需要用以下文本替换它:
DIFF_COEFF= 2.000e+07,2.000e+07,2.000e+07,2.000e+07,
2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,
2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,
2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,
2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,
2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,8.000e+05,
上面的每一行对应文本文件中的一个新行。
经过一番谷歌搜索,我认为在下面使用 Perl 可能有效,但它没有。我收到错误消息
在-e line 1, chunk 1 处非法除以零
s_orig='DIFF_COEFF=*4.000e+05,'
s_new='DIFF_COEFF= 2.000e+07,2.000e+07,2.000e+07,2.000e+07,\n2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,\n2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,\n2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,\n2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,\n2.000e+07,2.000e+07,2.000e+07,2.000e+07,2.000e+07,8.000e+05,'
perl -0 -i -pe "s:\Q${s_orig}\E:${s_new}:/igs" file.txt
这里有人知道正确的方法吗?
编辑 - 更多细节:此块之后的文本是“DIFF_COEFF_Q=”,后跟相同的一组数字,所以我需要搜索并替换显示的特定行。文本文件不是很大。
【问题讨论】:
-
(1) “text below”(
DIFF_COEFF及以下5行)与“other text”有何区别?例如,最后一行数字后面是什么? (2) 您需要像示例中那样将每个数字乘以 2,还是直接用文本替换? -
值列表真的以逗号结尾吗?
-
在替换结束时删除
/,即s:…:…:igs,而不是s:…:…:/igs。 -
所以你不想做计算,你只想从字面上替换?
-
鲍罗丁 - 为什么不情愿?我已经按照我的理解回答了每个人的问题。我想你不希望我把整个文本文件粘贴到这里,所以我说了我认为重要的内容。 “不幸的是,DIFF_COEFF 行下方的文本与显示的行非常相似(不同之处仅在于它以 DIFF_COEFF_Q 开头)”就我所见,下面的文本是明确的。这足以让 zdim 提供解决方案。长字符串替换工作完美。我提到的文字片段不再重复,如果这是你的意思(不清楚)。