我有一个这种类型的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问题。如果这是一个复制品,请道歉,请指导我回答。
答案 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/'