有条件地从数字字符串中删除最后一个字

时间:2015-01-23 01:03:11

标签: bash if-statement sed grep

我有一个大文件,我需要有条件地从以数字1-19开头的行中删除最后一个数字字段。我想逐行打印整个文件,包括那些不符合条件的行。

这是我的代码:

cat > test.txt
118222
1 0.5632 0.10 0.05 1.00 0.45 5.00 0.50 0
0.54 0.49 0.58 0.74 1.08 1.75 1.97 1.86 1.51 1.03 0.76 0.52
0.22 0.20 0.21 0.25 0.37 0.58 0.61 0.64 0.55 0.45 0.39 0.23
0.17 0.20 0.18 0.14 0.10 0.10 0.10 0.10 0.09 0.09 0.11 0.12
5 0.0172 0.10 0.05 1.00 0.45 5.00 0.50 1
0.35 0.32 0.39 0.71 1.15 1.87 1.96 1.72 1.36 0.91 0.70 0.43
0.31 0.30 0.29 0.27 0.36 0.57 0.57 0.57 0.46 0.35 0.34 0.31
0.28 0.29 0.26 0.16 0.11 0.11 0.12 0.11 0.11 0.10 0.14 0.26

#!/bin/bash

FILE=test.text
while read i; do
 echo ${i} | grep -E '^([1-9]|1[0-9])' && sed 's/.$//' || echo ${i}
done < $FILE

虽然grep和sed行可以单独工作,但这并不起作用。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

sed中使用条件替换。

sed '/^\([1-9]\|1[0-9]\) /s/.$//' test.text

我在开头的数字匹配后添加了一个空格。否则,它也会匹配不在118222范围内的1-19,因为它以1开头。

DEMO

您的标题表示您要删除该行中的最后一个字符,问题是最后一个数字字符。对于后者,它应该是:

sed '/^\([1-9]\|1[0-9]\) /s/[0-9]\([^0-9]*\)$/\1/' test.text