需要删除行中的最后一个零

时间:2019-05-28 06:30:13

标签: shell

需要读取文件。检查每行最后的零。如果最后一位为零,我想删除它。请为此提供帮助

input="temp.txt"
while IFS= read -r line
do 
echo "output    :$line"



if [[ $line == 0$ ]]; then
  echo " blash "
  else
    echo "anotherblash"
  fi

done < "$input"

3 个答案:

答案 0 :(得分:1)

您可以使用sed进行这种替换:

sed 's/0*$//' temp.txt

这将从每一行中删除所有尾随零。 0*匹配“零个或多个” 0,而$匹配行的结尾。

如果您只想删除一个0,则删除*

如果您希望在shell中做同样的事情(我假设您使用bash,因为您的尝试包括[[),您可以这样做:

#!/bin/bash

# match any line ending in one or more zeros
# capture everything up to the trailing 0s
re='(.*[^0])0+$'

while read -r line; do
  # use =~ for regex match
  if [[ $line =~ $re ]]; then
    # assign first capture group, discarding trailing 0s
    line=${BASH_REMATCH[1]}
  fi
  echo "$line"
done < temp.txt

但是这种方法的缺点是更加复杂且不易移植,因此我将使用sed选项。

答案 1 :(得分:1)

在表达式命令[[ $line == 0$ ]]中使用正则表达式0$,但是,正如man sh所说:

  

使用==和!=运算符时,右侧的字符串                 的运算符被认为是一种模式,并根据                 模式匹配下所述的规则。 …

     

另一个可用的二进制运算符=〜可用,具有相同的                 优先级为==和!=。使用时,将字符串                 操作者的权利被认为是扩展的常规表达式-                 并进行相应的匹配(如regex(3)中一样)。

因此,由于使用了==运算符,因此必须指定与文件名匹配相同的模式,即i。 e。 [[ $line == *0 ]]

答案 2 :(得分:1)

尽管John1024在注释中给出的解决方案是正确的方法,但是如果您希望遵循原始方法,则比较[[ $line == 0$ ]]没有意义,因为这只会检查行是否包含零的位数,由一个美元符号代替。相反,您必须进行正则表达式匹配,即

if [[ $line =~ 0$ ]]

如果行以零结尾,则结果为true。

另一种可能性是坚持不懈并将条件写为

if [[ $line == *0 ]]

请注意,在[[...]]中,=〜进行正则表达式匹配,而==进行通配符匹配(即,通过通配符进行匹配)。