使用 bash 的 $(( )) 运算符进行算术时意外的变量更新
我正在尝试从文件中删除几行。我确切地知道要删除多少行(例如,从顶部开始 2 行),但不知道文件中总共有多少行。所以我尝试了这个简单的解决方案:
$ wc -l $FILENAME
119559 my_filename.txt
$ LINES=$(wc -l $FILENAME | awk '{print $1}')
$ tail -n $(($LINES - 2)) $FILENAME > $OUTPUT_FILE
输出很好,但是 LINES 发生了什么?
$ wc -l $OUTPUT_FILE
119557 my_output_file.txt
$ echo $LINES
107
希望有人能帮助我了解发生了什么事。
I'm trying to trim a few lines from a file. I know exactly how many lines to remove (say, 2 from the top), but not how many total lines are in the file. So I tried this straightforward solution:
$ wc -l $FILENAME
119559 my_filename.txt
$ LINES=$(wc -l $FILENAME | awk '{print $1}')
$ tail -n $(($LINES - 2)) $FILENAME > $OUTPUT_FILE
The output is fine, but what happened to LINES??
$ wc -l $OUTPUT_FILE
119557 my_output_file.txt
$ echo $LINES
107
Hoping someone can help me understand what's going on.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
$LINES
有特殊含义。它是终端的行数,如果您调整终端窗口的大小,它将被重新设置。请参阅信息“(bash)Bash 变量”
。$LINES
has a special meaning. It is the number of rows the terminal has, and if you resize your terminal window, it will be re-set. Seeinfo "(bash)Bash Variables"
.它总是有助于分解你认为问题所在的位置。运行
应该可以告诉你问题出在哪里。
相反,使用
Hm.. 是的,恐怕@MichaelHoffman 可能更准确地诊断了你的问题。
我希望这有帮助。
It always helps to decompose where you thing the problem is. Running
should probably show you where the problem is.
Instead, use
Hm.. Yes, I'm afraid @MichaelHoffman is probably has diagnosed your problem more accurately.
I hope this helps.
您也可以只执行
sed 'X,Yd'
sed 'X,Yd'
sed 'X,Yd' < file
其中 X,Y 是要省略的行的范围(在本例中为 1,2)。
其他替代方案是:
sed 'X,+Yd'
省略从 X 行开始的 Y 行sed /regex/,Yd'
省略正则表达式匹配的行和 Y 之间的所有内容sed '/regex/,+Yd'
省略从正则表达式匹配的位置开始的 Y 行sed '/regex/,/regex/d'
省略两个正则表达式之间的所有内容注意:这些是 GNU sed 扩展
You could also just do
sed 'X,Yd' < file
Where X,Y is the range of the lines you want to omit (in this case it would be 1,2).
Other alternatives are:
sed 'X,+Yd'
omits Y lines starting from line Xsed /regex/,Yd'
omits everything between the line where the regex matches and Ysed '/regex/,+Yd'
omits Y lines starting from where the regex matchessed '/regex/,/regex/d'
omits everything between the two regexsNote: these are GNU sed extensions