Bash如何将整数添加到字符串中

3

我已经头痛了两个小时,但还是没能使它正常工作。
以下是我的代码:

  • 一个带有"\r"结尾的字符串,比如“133\r”。
  • 一个整数,我想把它加到上面字符串的数字后面。

我试过用sed将该字符串中的"\r"删除,然后使用(( )),希望这个数学表达式会截去"\r",但仍然没有成功。请指出我的错误!

非常感谢您提前帮忙!
下面是我从中读取字符串的文件,让我们假装我被迫读取整个文件(来自Notepad ++的屏幕截图)。


请包含您实际尝试的代码。 - l0b0
该字符串是否以ASCII回车符或两个字面字符 '' 和 'r' 结尾? - chepner
LF 对应的是 \n,而不是 \r !!! LF 用于 Unix 系统,\r 用于 DOS,并对应 CR(请参见:http://en.wikipedia.org/wiki/Newline) - bendaizer
@bendaizer,我完全困惑了,因为当我尝试对字符串和整数求和时,我得到了错误Syntax error: invalid arithmetic operator (error token is "\r") - mr.nothing
你能展示一下你的代码吗? - bendaizer
@bendaizer,不幸的是,我的代码向私有仓库发出了curl get请求,因此即使我在这里列出它,也没有人能够使用它。请查看对我有效的已接受答案。 - mr.nothing
6个回答

4
您可以使用 awk 命令:
awk 'BEGIN { var="133\r"; print var+3; }'

输出结果为 136

或者你可以使用 bash 参数扩展:

VAR="133\r"
VAR2=${VAR%\\r}
echo $VAR

输出: 133,所以现在VAR2包含去掉\r的数字,您可以向其添加一个整数。


3
不需要使用sed来删除子字符串,bash可以为您完成。
#!/usr/bin/env bash

mystr="133\r"
myint=2

newstring=${mystr%\\r}               # Remove the substring "\r" from $mystr
myanswer=$(expr $newstring + $myint) # Add the two numbers
echo $myanswer                       # 135

不幸的是,它输出了以下内容:expr: 非整数参数 - mr.nothing
请参考我在问题中的评论,了解你字符串实际上的结尾是什么。 - chepner
使用标准的 $(( newstring + myint )) 替换 expr 命令。 - chepner
当我将$(expr $newstring + $myint)更改为$(( newstring + myint ))时,它会显示“)2yntax error: invalid arithmetic operator (error token is "\r - mr.nothing
你在字符串末尾有一个字面回车,而不是两个字符的序列。使用${mystr%?}作为一种简单的标准方法来删除它。如果mystr以除回车以外的其他内容结尾,则可以使用bash特定的(虽然我相信它将被包含在标准中)${mystr%$'\r'} - chepner

3
$ a=$'133\r'
$ printf "%s" "$a" | od -c
0000000   1   3   3  \r
0000004
$ echo $((a+3))
")syntax error: invalid arithmetic operator (error token is "
$ echo $(( ${a%[[:space:]]} + 3 ))
136

这是最先进的技术!非常感谢你的帮助! - mr.nothing
当然,关键是要避免在字符串中首先出现CR,而不是事后处理它。这是一个快速的dos2unix克隆:sed 's/\r$//' file | ... - glenn jackman

2

简单的解决方案

a="133\r"
b=${a/\\r/}

甚至更简单
b=${a%\\r}

as it was suggested by chepner


2
更简单(也是标准的):${a%\\r} - chepner

1
您可以使用sed获取该数字,如下:

sed命令

sed 's/\([0-9]*\).*/\1/'

1
如果你想使用sed删除\r,请不要忘记转义\,以下内容对我有效:
echo "133\r" | sed 's/\\r//' 

并输出133

编辑:

正如我在评论中所说:“LF对应于\n,而不是\r !!! LF用于Unix系统,\r用于dos,并对应于CR(请参见:en.wikipedia.org/wiki/Newline)”

因此你应该尝试这个:

echo "133\n" | sed 's/\\n//' 

它会输出与从文件中读取的完全相同的内容(请在编辑后的帖子中查看我的截图)。 - mr.nothing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接