需要将给定行的 -(减号)符号仅交换为数字而不是文本

需要将给定行的 -(减号)符号仅交换为数字而不是文本

我有一个输入,其中分隔<;|符如下所示:-

1-<;|3-Text <;|3.13-<;|0.28-<;|9
0.12-<;|2-Text <;|3.99-<;|4.11-<;|6
0.13-<;|3-Text <;|8.13-<;|3.98-<;|3

我的预期输出应该是:-

-1<;|3-Text <;|-3.13<;|-0.28<;|9 
-0.12<;|2-Text <;|-3.99<;|-4.11<;|6
-0.13<;|3-Text <;|-8.13<;|-3.98<;|3

在这里,我想仅在整数或小数值前面添加减号,而不是在文本字段中添加减号。这些列不是固定的,可以是任何顺序。我正在尝试使用sed命令但没有成功。请在这种情况下帮助我。

答案1

使用 GNU sed:

sed 's/\([[:digit:]]\+\)\(\.[[:digit:]]*\)\{0,1\}-\(\W\)/-\1\2\3/g'

需要GNU 版本sed才能匹配-with之后的“非单词”字符\W。您可以使用非 gnu 版本来模拟这一点[^a-zA-Z0-9_]

如果-不应该更改,以防它位于空格之前,而不仅仅是向先前的模式添加空格,因此:

sed 's/\([[:digit:]]\+\)\(\.[[:digit:]]*\)\{0,1\}-\([^a-zA-Z0-9_ ]\)/-\1\2\3/g'

相关内容