【发布时间】:2010-04-21 22:28:57
【问题描述】:
编辑:我事先不知道我的数字将在哪个“列”,我想要一个单行。显然 sed 不做算术,所以也许是基于 awk 的单线解决方案?
我有一个字符串:(注意间距)
eh oh 37
我希望它变成:
eh oh 36
(所以我想保持间距)
使用 awk 我不知道怎么做,到目前为止我有:
echo "eh oh 37" | awk '$3>=0&&$3<=99 {$3--} {print}'
但这给出了:
eh oh 36
(丢失的空格字符,因为字段分隔符是'')
有没有办法问 awk 类似 “使用与输入完全相同的字段分隔符打印输出”?
然后我尝试了其他方法,使用 awk 的 sub(..,..) 方法:
' sub(/[0-9][0-9]/, ...) {print}'
但还没有雪茄:我不知道如何引用正则表达式并在第二个参数中对其进行算术运算(我现在留下了“...”)。
然后我尝试使用 sed,但在此之后卡住了:
echo "eh oh 37" | sed -e 's/\([0-9][0-9]\)/.../'
我可以使用对匹配数字的引用从 sed 进行算术运算,并且输出不修改空格字符的数量吗?
请注意,这与我关于 Emacs 的问题以及如何将其应用于某些(大)Emacs 区域(使用带有 Emacs 的 shell-command-on-region 的替换区域)的问题有关,但它不是相同的问题:这个问题专门关于如何在使用 awk/sed/etc 时“保留空格”。
【问题讨论】:
-
我知道使用 perl 会很简单——你可以让
split给你分隔符和字段。 -
您可以在 awk 中通过完全忽略它的字段拆分来管理它,只在
$0上做一些正则表达式的东西,但这有点不雅。 perl 是一种选择吗? -
@Jefromi:当然,Perl 是一种选择……但我也对丑陋的 awk 版本感兴趣 :)