使用 bash 的 $(( )) 运算符进行算术时意外的变量更新

发布于 2024-12-16 19:54:03 字数 391 浏览 0 评论 0原文

我正在尝试从文件中删除几行。我确切地知道要删除多少行(例如,从顶部开始 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

看透却不说透 2024-12-23 19:54:03

$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. See info "(bash)Bash Variables".

神仙妹妹 2024-12-23 19:54:03

它总是有助于分解你认为问题所在的位置。运行

 wc -l $FILENAME | awk '{print $1}'

应该可以告诉你问题出在哪里。

相反,使用

LINES=$(wc -l < $FILENAME )

Hm.. 是的,恐怕@MichaelHoffman 可能更准确地诊断了你的问题。

我希望这有帮助。

It always helps to decompose where you thing the problem is. Running

 wc -l $FILENAME | awk '{print $1}'

should probably show you where the problem is.

Instead, use

LINES=$(wc -l < $FILENAME )

Hm.. Yes, I'm afraid @MichaelHoffman is probably has diagnosed your problem more accurately.

I hope this helps.

莫言歌 2024-12-23 19:54:03

您也可以只执行 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 X

sed /regex/,Yd' omits everything between the line where the regex matches and Y

sed '/regex/,+Yd' omits Y lines starting from where the regex matches

sed '/regex/,/regex/d' omits everything between the two regexs

Note: these are GNU sed extensions

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文