【问题标题】:How to enter mathematical expressions inside the "sed" command?如何在“sed”命令中输入数学表达式?
【发布时间】:2018-12-25 00:19:02
【问题描述】:

给定一个数字列表,我想通过“sed”命令仅显示从 2 到变量范围内的行,减去 1。如何将表达式中的变量减 1?我不喜欢在命令之前创建另一个变量的解决方案。

echo -e "1\n2\n3\n4\n5\n6\n7\n" | sed -n "3,+$var p"

如果 $var=3,则显示 3-4-5-6。 但如果我想打印最多 5 个 (3-4-5),我必须从变量 ($var-1) 中减去 1。

我想要一种插入 ($var - 1) 的方法

【问题讨论】:

  • 要加强 anubhava 关于echo -e 不可移植的说法,请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html,尤其是选项、应用程序用法和基本原理部分。除了在输出上打印-e 之外,标准不允许echo -e 做任何事情。正如 APPLICATION USAGE 部分所述:除非-n(作为第一个参数)和转义序列都被省略,否则不可能在所有 POSIX 系统中可移植地使用 echo

标签: linux bash shell


【解决方案1】:

您可以在 shell 中使用$((...)) 进行算术运算:

echo -e "1\n2\n3\n4\n5\n6\n7\n" | sed -n "3,+$((var-1)) p"

3
4
5

我建议使用printf,因为它更便携:

printf '%s\n' {1..7} | sed -n "3,+$((var-1)) p"

bash 中,您可以使用here-string 并避免使用管道:

sed -n "3,+$((var-1)) p" <<< $'1\n2\n3\n4\n5\n6\n7\n'

【讨论】:

  • printf '%s\n' {1..7} 是一个更简洁的替代方案。
  • @anubhava 完美,它有效,谢谢!你能告诉我你为什么建议使用 printf 吗?
  • @Giupo,...我实际上只是在对该问题的评论中提到了这一点,并附有相关标准的链接。 bash 的echo 不符合POSIX sh 标准默认情况下,但它可以在编译时或运行时配置以符合,此时echo -e 将在输出上打印-e。当然,您编写的脚本假设 echo -e 将按照您期望的方式工作,但根本无法保证在其他 shell 上正常运行。
  • @anubhava ...顺便说一句,“in bash”限定符并不是真正需要的,$(( ... )) 是 POSIX 指定的语法。
  • 非常感谢,我会进入这个问题! :)
猜你喜欢
  • 2011-04-23
  • 2011-12-01
  • 2012-10-29
  • 2013-08-07
  • 1970-01-01
  • 2014-07-22
  • 2017-02-01
  • 2020-05-21
相关资源
最近更新 更多