sed 根据文件中的条件进行多次替换

mic*_*oud 6 linux bash sed

专家我有一个文本文件,其中有一些数学数据,并且有连字符-,我需要将其替换0MB数字末尾的连字符,也需要将其删除,因此我只能得到数字。

以下是名为 的文件中的示例数据file1

数据:

$ 猫文件1

 3708MB 5073MB 5153MB  0MB
 -    63097MB 9939MB  53376MB
 -    817MB   681MB   271MB
 -    2655MB   692MB   2112MB
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

$ /bin/sed   's/\r//g; s/-/0/g; s/MB//g' tt4
 3708 5073 5153  0
 0    63097 9939  53376
 0    817   681   271
 0    2655   692   2112
Run Code Online (Sandbox Code Playgroud)

column或者只是为了通过命令更好地对其进行列化......

$ /bin/sed   's/\r//g; s/-/0/g; s/MB//g' tt4| column -t
3708  5073   5153  0
0     63097  9939  53376
0     817    681   271
0     2655   692   2112
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来严格确保仅替换-前缀和后缀中没有任何内容的连字符,并且MB仅删除其和数字末尾的连字符。

Jus*_*ang 5

您必须考虑如何独特地捕获模式,以便将其与模式的任何其他外观隔离。

这里,-似乎被空白所包围。因此,您可以使用它来使其与任何其他文本-(例如 text-text )不同。

sed 's/ - / 0 /g'
Run Code Online (Sandbox Code Playgroud)

对于模式 MB,您可以确保您正在寻找遵循某些数字的模式。


sed -r 's/([0-9]+)MB/\1/g' 

Run Code Online (Sandbox Code Playgroud)

所以你可以一起写:

sed -r 's/ - / 0 /g;s/([0-9]+)MB/\1/g' 

Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 5

使用 GNU 或 BSD sed for -E,这可能会满足您的要求:

$ sed -E 's/(^| )-( |$)/\10\2/g; s/([0-9])MB( |$)/\1\2/g' file
 3708 5073 5153  0
 0    63097 9939  53376
 0    817   681   271
 0    2655   692   2112
Run Code Online (Sandbox Code Playgroud)