我的文本文件如下所示。该文件包含一些负面数据。所以我想用零替换那些数据。
1,2,3
4,5,-6
7,-8,9
我尝试过以下命令。
sed 's/-*/0/g' 1.txt
但是没有获得所需的输出。所以请任何人帮助我。
答案 0 :(得分:2)
试试这个:
sed 's/-[0-9]\+/0/g' 1.txt
这样做的方式是,sed
会找到与模式-[0-9]\+
匹配的所有字符序列,并将其替换为0
。现在,它们对-[0-9]\+
模式的含义如下:它将找到一个-
字符,后跟一个非空字符序列(这是\+
的含义),它完全由字符组成在0
和9
之间的集合中。
答案 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