有没有办法对bash中括号内的数字进行操作?

磺基氰酸盐

我有一个带有一些格式行的输入文件 -

此处为任意文本 {{x1 x2} {x3 x4}} 此处为任意文本

其中,x1、x2、x3 和 x4 是浮点数和/或整数。有没有办法通过使用 awk/perl/bash 脚本将这些数字中的每一个(总是括在花括号内)加倍?

我尝试使用以下变体,但我是 awk 的新手,甚至无法隔离花括号内的数字 -

awk -F( '{gsub("{}", " ", $NF); 打印 $NF}'

例子 -

输入:

此处为任意文本 1 {{1 2} {3 4}} 此处为任意文本 1

此处为任意文本 2 {{2.0 4} {6.0 8}} 此处为任意文本 2

此处为任意 text2p5

此处为任意 text3 {{3 6} {9 12}} 此处为任意 text3

此处为任意 text4 {{4 8} {12 16}} 此处为任意 text4

输出:

此处为任意文本 1 {{2 4} {6 8}} 此处为任意文本 1

此处为任意文本 2 {{4.0 8} {12.0 16}} 此处为任意文本 2

此处为任意 text2p5

此处为任意 text3 {{6 12} {18 24}} 此处为任意 text3

此处为任意 text4 {{8 16} {24 32}} 此处为任意 text4

您可以捕获所需的模式并使用它们的替换来重写字符串。

这是一个基本方法:首先捕获组件,处理它们,然后重新组装

use warnings;
use strict;

my $str = 'Arbitrary text here {{1 2} {3 4}} arbitrary text here';

my @parts = $str =~ /(.*?){{(\d+) (\d+)} {(\d+) (\d+)}}(.*)/;

# If we expect only lines in the above format test and handle the error
if (@parts != 6) {
    die "Didn't find expected patterns in: $str";
}

my $pre_text  = shift @parts;
my $post_text = pop @parts;

my ($r1, $r2, $r3, $r4) = map { $_*2 } @parts;

my $result = $pre_text . "{{$r1 $r2}{$r3 $r4}}" . $post_text;

print $result, "\n";

该代码假定输入的确切格式如图所示。这种“手动”、循序渐进的方法的一个优点是,可以更轻松地根据需要调整流程的每个部分。


这可以在一个正则表达式中完成。由于盲目相信预期的数据格式通常是一个非常糟糕的主意,我们可以将替换代码放在子中,以便可以检查匹配并根据需要更轻松地调整处理

sub repl {
    my @nums = @_;
    die "Expected four numbers, got: @nums" if @nums != 4;

    my ($r1, $r2, $r3, $r4) = map { $_ * 2 } @nums;    

    return "{{$r1 $r2} {$r3 $r4}}";
}

$str =~ s/{{(\d+) (\d+)} {(\d+) (\d+)}}/repl($1, $2, $3, $4)/e;

这也大大清理了正则表达式本身。

如果模式不匹配,则什么都不会发生并$str保持不变。如果我们只期望这种格式的行,那么我们可能想知道失败的匹配。了解它的一种方法是

if (not $str =~ s/.../) { warn "Failed match on: $str" }

因为替换运算符s/返回所做的替换数。


更新提供的输入示例

上面的单正则表达式方法,带有input.txt输入行的文件

use warnings;
use strict;

my $file = 'input.txt';
open my $fh, '<', $file  or die "Can't open $file: $!";

while (<$fh>) {
    s/{{(\d+) (\d+)} {(\d+) (\d+)}}/repl($1, $2, $3, $4)/e;
    print;
}

sub repl {
    my @nums = @_; 
    die "Expected four numbers, got: @nums" if @nums != 4;
    my ($r1, $r2, $r3, $r4) = map { $_ * 2 } @nums;    
    return "{{$r1 $r2} {$r3 $r4}}";
}

印刷

此处任意文本1 {{2 4} {6 8}} 此处
任意文本1 此处任意文本2 {{4 8} {12 16}} 此处
任意文本2 此处
任意文本2p5 此处任意文本3 此处{{6 12} {18 24}} 任意文本3这里
任意 text4 这里 {{8 16} {24 32}} 这里任意 text4

die ...潜艇中的线只是为了保护它,也许还有其他用途。在我们使用它的正则表达式中,除非找到所有四个匹配项,否则 sub 永远不会被调用。

上面的第一种方法,将该代码放置在输入行上的循环中,打印出相同的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法在ASP.NET MVC Razor html帮助器中的大括号内隐藏html?

来自分类Dev

有没有办法在不使用python中的sort()的情况下对基于数字的数字进行排序?

来自分类Dev

有没有办法用scanf读取括号内的整数?

来自分类Dev

有没有办法对 ansible 主机文件中的组进行排序,而无需对组内的主机进行排序?

来自分类Dev

有没有办法知道Python中没有索引的列表的哪个数字?

来自分类Dev

有没有办法将向量成对放在方括号中

来自分类Dev

有没有办法检测OCaml代码中的多余括号?

来自分类Dev

有没有办法在android studio中更改花括号的代码格式?

来自分类Dev

有没有办法在命令历史记录中的 bash 命令内部进行搜索和替换?

来自分类Dev

有没有办法在UE4中进行游戏内高分辨率截图?

来自分类Dev

有没有办法让操作员=枚举?

来自分类Dev

有没有办法取消 DispatchQueue concurrentPerform 操作?

来自分类Dev

有没有办法使Int变量等于(==)数组中存储的所有数字?

来自分类Dev

有没有办法进行多色边框

来自分类Dev

有没有办法进行连锁的PayPal付款?

来自分类Dev

有没有办法进行多行输入?

来自分类Dev

有没有办法影响 bash 历史的行为?

来自分类Dev

有没有办法从 Groovy 运行 Bash

来自分类Dev

有没有办法防止数字在JavaScript中为负数?

来自分类Dev

有没有办法使用javascript从图片src网址中获取数字?

来自分类Dev

有没有办法补充数据帧中缺失的数字?

来自分类Dev

Specman e:有没有办法限制数字中设置的位数?

来自分类Dev

有没有办法在Perl中检查CUSIP的数字

来自分类Dev

有没有办法限制 Handlebars 输出中数字显示的小数位数?

来自分类Dev

有没有办法在输入字段中显示项目符号而不是数字

来自分类Dev

有没有办法在列表框文本中增加数字?

来自分类Dev

有没有办法从6502的操作码中以编程方式确定寻址模式?

来自分类Dev

Python-有没有办法将操作(+-* /)存储在列表中或作为变量存储?

来自分类Dev

有没有办法在Intellij-IDEA中自动执行重复的重构操作?

Related 相关文章

  1. 1

    有没有办法在ASP.NET MVC Razor html帮助器中的大括号内隐藏html?

  2. 2

    有没有办法在不使用python中的sort()的情况下对基于数字的数字进行排序?

  3. 3

    有没有办法用scanf读取括号内的整数?

  4. 4

    有没有办法对 ansible 主机文件中的组进行排序,而无需对组内的主机进行排序?

  5. 5

    有没有办法知道Python中没有索引的列表的哪个数字?

  6. 6

    有没有办法将向量成对放在方括号中

  7. 7

    有没有办法检测OCaml代码中的多余括号?

  8. 8

    有没有办法在android studio中更改花括号的代码格式?

  9. 9

    有没有办法在命令历史记录中的 bash 命令内部进行搜索和替换?

  10. 10

    有没有办法在UE4中进行游戏内高分辨率截图?

  11. 11

    有没有办法让操作员=枚举?

  12. 12

    有没有办法取消 DispatchQueue concurrentPerform 操作?

  13. 13

    有没有办法使Int变量等于(==)数组中存储的所有数字?

  14. 14

    有没有办法进行多色边框

  15. 15

    有没有办法进行连锁的PayPal付款?

  16. 16

    有没有办法进行多行输入?

  17. 17

    有没有办法影响 bash 历史的行为?

  18. 18

    有没有办法从 Groovy 运行 Bash

  19. 19

    有没有办法防止数字在JavaScript中为负数?

  20. 20

    有没有办法使用javascript从图片src网址中获取数字?

  21. 21

    有没有办法补充数据帧中缺失的数字?

  22. 22

    Specman e:有没有办法限制数字中设置的位数?

  23. 23

    有没有办法在Perl中检查CUSIP的数字

  24. 24

    有没有办法限制 Handlebars 输出中数字显示的小数位数?

  25. 25

    有没有办法在输入字段中显示项目符号而不是数字

  26. 26

    有没有办法在列表框文本中增加数字?

  27. 27

    有没有办法从6502的操作码中以编程方式确定寻址模式?

  28. 28

    Python-有没有办法将操作(+-* /)存储在列表中或作为变量存储?

  29. 29

    有没有办法在Intellij-IDEA中自动执行重复的重构操作?

热门标签

归档