需要读取文件。检查每行最后的零。如果最后一位为零,我想删除它。请为此提供帮助
input="temp.txt"
while IFS= read -r line
do
echo "output :$line"
if [[ $line == 0$ ]]; then
echo " blash "
else
echo "anotherblash"
fi
done < "$input"
答案 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 ]]
请注意,在[[...]]中,=〜进行正则表达式匹配,而==进行通配符匹配(即,通过通配符进行匹配)。