用带有sed空间的模式替换所有数字

时间:2016-10-24 20:07:47

标签: sed

我有一个这种类型的txt文件:

360 181
363
-100
40
....
360 181
5
3
15
....

特别是这是从grib2文件中提取的,所以" 360 181" line本质上是值的标题,它告诉我360 * 181值(它是一个网格文件)。这是一个包含许多字段的grib2文件,因此,它们被许多字段分开,并且由#34; 360 181"行,每个变量一个。

我必须将所有值替换为行" 360 181"带有标志值,9.9990003E + 20(我必须创建一个缺少值的grib文件)。

360 181
9.9990003E+20
9.9990003E+20
9.9990003E+20
....
360 181
9.9990003E+20
9.9990003E+20
9.9990003E+20
....

我已经尝试了一段时间,但我被卡住了。

我的尝试是:

 sed ’s/[^360 181]/[0-9]*/9.9990003E+20/‘ <in.txt >out.txt
 sed ’s/[^\<360 181\>]/[0-9]*/9.9990003E+20/‘ <in.txt >out.txt

但我没有成功。

在SO中可能有一个答案,我已经进行了广泛的搜索,但是有许多SED问题。如果这是一个复制品,请道歉,请指导我回答。

3 个答案:

答案 0 :(得分:2)

OP解决方案的更正版本

sed '/^360 181$/! s/^.*$/9.9990003E+20/' <in.txt >out.txt
  • /^360 181$/!是一个上下文地址,它匹配所有不匹配的行(! ^...$ )包含文字360 181

    • 针对每个输入行评估上下文地址,如果匹配,则执行关联的命令(关联多个命令,使用{ ...; ...; }
  • 因此,
  • s/^.*$/9.9990003E+20仅适用于非360 181行,其中文字9.9990003E+20代替整个行s^.*$更短的选择:只是.*)。

对于OP自己尝试的问题

# BROKEN COMMANDS
sed 's/[^360 181]/[0-9]*/9.9990003E+20/' <in.txt >out.txt
sed 's/[^\<360 181\>]/[0-9]*/9.9990003E+20/' <in.txt >out.txt
  • [...]是用于字符集括号表达式(多个字符(字符类/范围),其中任何一个匹配< em>单个输入字符。),不匹配字符串

    • 暂且不说:括号表达式开头的^否定以下字符 - 从^作为行首锚点的明显用法。
  • s///函数仅使用 2 参数:要匹配的正则表达式,以及用匹配字符串替换的内容。

答案 1 :(得分:1)

我搜索了只包含带可选负号的数字的行,并将其替换为所需的数字

$ cat in
360 181
363
-100
40
360 181
5
3
15

CMD

$ sed -re 's/^-?[0-9]+$/9.9990003E+20/g' < in

Outupt

360 181
9.9990003E+20
9.9990003E+20
9.9990003E+20
360 181
9.9990003E+20
9.9990003E+20
9.9990003E+20

答案 2 :(得分:1)

我认为你可以匹配所有没有空格的行:

sed 's/^[^ ]\+$/9.9990003E+20/'