专家我有一个文本文件,其中有一些数学数据,并且有连字符-,我需要将其替换0为MB数字末尾的连字符,也需要将其删除,因此我只能得到数字。
以下是名为 的文件中的示例数据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仅删除其和数字末尾的连字符。
您必须考虑如何独特地捕获模式,以便将其与模式的任何其他外观隔离。
这里,-似乎被空白所包围。因此,您可以使用它来使其与任何其他文本-(例如 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)
使用 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)