gpt4 book ai didi

unix - sed/awk 或其他 : one-liner to increment a number by 1 keeping spacing characters

转载 作者:行者123 更新时间:2023-12-04 22:37:49 29 4
gpt4 key购买 nike

编辑 :我事先不知道我的数字将在哪个“列”,我想要一个单行。显然 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 时“保留空间”。

最佳答案

这是 的变体ghostdog74的不需要将数字 anchor 定在字符串末尾的答案。这是使用 match 完成的而不是依靠数字处于特定位置。

这会将第一个数字替换为其值减一:

$ echo "eh oh    37      aaa     22    bb" | awk '{n = substr($0, match($0, /[0-9]+/), RLENGTH) - 1; sub(/[0-9]+/, n); print }'
eh oh 36 aaa 22 bb

使用 gsub那里而不是 sub将用“36”替换“37”和“22”。如果线路上只有一个数字,则使用哪个都无所谓。但是,通过这样做,它将处理带有尾随空格的数字以及可能存在的其他非数字字符(在一些空格之后)。

如果您有 gawk ,您可以使用 gensub像这样挑选字符串中的任意数字(只需设置 which 的值):
$ echo "eh oh    37      aaa     22    bb    19" |
awk -v which=2 'BEGIN { regex = "([0-9]+)\\>[^0-9]*";
for (i = 1; i < which; i++) {regex = regex"([0-9]+)\\>[^0-9]*"}}
{ match($0, regex, a);
n = a[which] - 1; # do the math
print gensub(/[0-9]+/, n, which) }'
eh oh 37 aaa 21 bb 19

第二个 ( which=2 ) 数字从 22 变为 21。并且保留了嵌入的空格。

它分为多行以使其更易于阅读,但它是可复制/可粘贴的。

关于unix - sed/awk 或其他 : one-liner to increment a number by 1 keeping spacing characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2687009/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com