如何用零替换文件中的减号值

时间:2016-09-08 15:48:34

标签: awk sed

我的文本文件如下所示。该文件包含一些负面数据。所以我想用零替换那些数据。

1,2,3
4,5,-6
7,-8,9

我尝试过以下命令。

sed 's/-*/0/g' 1.txt

但是没有获得所需的输出。所以请任何人帮助我。

5 个答案:

答案 0 :(得分:2)

试试这个:

sed 's/-[0-9]\+/0/g' 1.txt

这样做的方式是,sed会找到与模式-[0-9]\+匹配的所有字符序列,并将其替换为0。现在,它们对-[0-9]\+模式的含义如下:它将找到一个-字符,后跟一个非空字符序列(这是\+的含义),它完全由字符组成在09之间的集合中。

答案 1 :(得分:1)

你必须更好地理解sed的正则表达式。 -*中的s /-*/0/g表达式将匹配零个或多个“ - ”字符。正则表达式中的*表示零个或多个重复项,而不是通配符,.表示所有字符集都匹配单个字符。见http://www.grymoire.com/Unix/Regular.html

对于您的问题,您必须构建一个RE以匹配任何负数(也许您还需要考虑浮点数)。我建议:

-[0-9]*\.?[0-9]+

这是sed程序的扩展正则表达式,意思是以-开头,可以带或不带前点数或点,并且必须包含至少一个数字。

所以

sed -r s/-[0-9]*\.?[0-9]+/0/g 1.txt >2.txt

是你需要的。 -r选项表示使用扩展正则表达式。

一些测试:

echo '12, 0.12, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
      12, 0.12, 0
echo '12, -234, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
      12, 0, 0
echo '-0.98, 2.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
          0, 2.34, 0
echo '-9.8, 0.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
         0, 0.34, 0
echo '-9.8, 1.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
         0, 1.34, 0

希望这会有所帮助,请在http://www.grymoire.com/Unix/Sed.html上查看导师。

由于

答案 2 :(得分:1)

AWK:

$ awk 'gsub(/-[0-9]+/,0)1' 1.txt

与@ redneb的sed解决方案相同但在awk中。将所有-起始号码字符串([0-9]+)替换为记录为$ 0的0,然后将其打印出来(1到最后)。

答案 3 :(得分:1)

awk 'sub(/-./,"0")1' file
1,2,3
4,5,0
7,0,9

答案 4 :(得分:0)

使用awk,你会写

awk -F, -v OFS=, '{for (i=1; i<=NF; i++) if ($i < 0) $i = 0; print}' file

我的sed将是

sed -r 's/(^|,)-[^,]+/\10/g' file