Bash - 在 perl 正则表达式中使用变量以及匹配组

2024-05-12

这是我在 stackoverflow 上的第一篇文章,如果我错过了一些重要的内容,请原谅我。 我目前遇到以下问题。目标是根据我准备的文件列表动态替换端口号find。这些文件中的所有端口均以数字“4”开头,有 5 位数字。

现在是棘手的部分,我只替换数字 #2 和 #3,并保留位置 1、4 和 5。示例:

old port in file: 40380, 40381
new port in file: 41580, 40381

我正在开发 Sun Solaris 5.10,因此我更喜欢使用 perl 进行内联替换

最后是关键问题:如何组合 $1(第 1 组)+ $PIN_PINNO + $3(第 3 组),结果为:41580

NEW_PINNO=15
LOGI=$HOME/filelist.txt

# port replacement
for file in `cat $LOGI`
do
    perl -pe 's/[\:\>\=]\s*(4)(\d{2})(\d{2})\b/$1${NEW_PINNO}$3/g' $file
done

提前谢谢了


perl -pse 's/ [:>=]\s* \K (\d)\d\d(\d\d) \b/$1$pin$2/gx' -- -pin="$new_pinno" file
  • 您的正则表达式将匹配 [冒号、大于号、等号] 和空格,但您不将它们包含在替换中。我正在使用\K指令匹配这些字符,但随后忘记它们(参考:http://perldoc.perl.org/perlre.html#Lookaround-Assertions http://perldoc.perl.org/perlre.html#Lookaround-Assertions)
  • 我正在使用-s启用“基本开关解析”的选项,将 shell 变量传递到 Perl 中,而无需玩引用游戏。 (参考:http://perldoc.perl.org/perlrun.html http://perldoc.perl.org/perlrun.html)

Testing

new_pinno=15
perl -pse 's/ [:>=]\s* \K (\d)\d\d(\d\d) \b/$1$pin$2/gx' -- -pin="$new_pinno" <<END
var1=40380
var2=40381
END
var1=41580
var2=41581

Notes

  • 你不应该在 shell 中使用 ALL_CAPS_VARNAMES,让 shell 保留它们。总有一天,你会用PATH=something然后想知道为什么你的脚本被破坏了。
  • @123的评论是有效的。这是从文件中读取行的安全方法:

    while read -r file; do
        perl ... "$file"
    done < "$LOGI"
    

    ref: http://mywiki.wooledge.org/DontReadLinesWithFor http://mywiki.wooledge.org/DontReadLinesWithFor

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash - 在 perl 正则表达式中使用变量以及匹配组 的相关文章

  • 正则表达式提取大括号之间的文本

    我正在尝试提取 PHP 中花括号之间的文本 例如 欢迎 user first name 使用 site 版本 1 5 您的用户名 是 user username 您目前的声誉是 user reputation name 我用过 在某些情况下
  • 用于替换前 5 个数字的正则表达式,无论它们之间有什么?

    我正在努力实现以下匹配 Input 123 45 6789 123456789 1234 正则表达式尝试输出 d 5 123 45 6789 123456789 1234 d 2 3 123 45 6789 123456789 1234 d
  • C++11 基于范围的自动 for 循环(按值、引用和指针)

    我知道如何在 for 循环中使用 auto 关键字来按值或引用迭代此数组 struct A void fun int main A a 2 Value for auto x a x fun Ref for auto x a x fun Po
  • 如何运行 bash 压缩脚本?

    有没有一种方法可以直接运行带有 参数 的压缩bash脚本 而无需将其解压缩到文件中 然后运行解压缩的文件 例如 我需要使用一些给定的参数执行 setup mysql gzip 压缩脚本 n wordpress locahost 而不先解压缩
  • 如何使用正则表达式限制小数点之前/之后/小数点以及整体的位数?

    我正在尝试检查数值是否具有特定数量的数字 总共不应超过 19 位数字 小数点前不能超过17位 整数部分 小数点后不得超过 4 位 小数部分 可以有小数点也可以没有 前面可以有 或 或没有 有效示例 1 1 0 0 1234567890123
  • 如何只读取文件的第一行

    我已经用谷歌搜索了一段时间 但我找不到只读取文件第一行的函数 我需要读取文本文件的第一行并从中提取日期 Perl 新手 open my file lt filename txt my firstLine lt file gt close f
  • 简单的 preg_replace 返回 null

    为什么这个非常简单的 preg replace 返回 null preg replace s test test 这个想法是删除空格 您忘记添加分隔符 preg replace s test test 而且最好使用 s 代替 s 在你的模式
  • 在java中迭代日期

    我需要遍历一系列日期 不确定如何在 for 循环中获取第二天 我在用java util Date So plusDays 1 不能在 for 循环中用于获取下一个日期 Used date1 new Date date1 getTime 10
  • Jade(当前称为“Pug”)模板引擎中的循环

    我想使用一个简单的循环 例如for int i 0 i lt 10 i 如何在 Jade 引擎中使用它 我正在使用 Node js 并使用expressjs 框架 例如 for var i 0 i lt 10 i li array i 你可
  • 正则表达式匹配任何重复两次的字符

    我试图确定提供的字符串是否包含重复两次的字符 以下是我正在使用的正则表达式 a z 1 1 但是 当针对以下字符串进行测试时 下面的两个字符串都与模式匹配 尽管我使用了 1 gt gt gt re findall r a z 1 1 abc
  • 具有数组属性的 IFC 正则表达式

    IFC 是用于建筑项目的 STEP 文件的变体 IFC 包含有关正在建造的建筑物的信息 该文件基于文本 易于阅读 我正在尝试将这些信息解析为 python 字典 每行的一般格式类似于以下内容 第2334章 IFCMATERIALLAYERS
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • For 循环内的 For 循环 Javascript

    由于某种原因 该语句跳过了一些数据 我是否缺少一个 continue 语句某处或某事 这是代码 for var i 0 len data ORDER STATUS 0 ORDERS length i lt len i if data ORD
  • 如何使用 java.util.regex.* 执行部分匹配?

    我一直在使用 java util regex 类来实现 Java 中的正则表达式 到目前为止一切都很好 但今天我有一个不同的要求 例如 考虑模式为 aabb 现在 如果输入字符串是 aa 它肯定不匹配 但是如果我附加 bb 它仍然有可能变成
  • R 获取子字符串和正则表达式?

    我有一组文件名字符串 我想提取 符号之后但文件扩展名之前的所有字符 例如 文件名之一是 HelloWorld you txt 我想返回字符串you 这是我的代码 hashPos grep name fixed TRUE dotPos len
  • 使用“严格引用”时不能使用字符串作为 ARRAY 引用

    我正在尝试执行下面提到的代码并观察到错误 在使用 严格引用 时 无法使用字符串 RCSoWLAN ePDG 2 Qguest ASUS ATT 作为 ARRAY 引用 Perl代码 perl64 bin perl use strict us
  • 水银大号

    你知道如何让 Quicksilver 在屏幕上显示大量的大字体吗 通过点击 然后输入自由文本 选择 操作 下的 查看大字体 并按 Enter 键 好吧 有谁知道一种以编程方式做到这一点的方法吗 另外 quicksilver 是必需的还是内置
  • PHP 时间间隔

    我正在寻找一个看起来应该非常简单的解决方案 但似乎我不能在这里找到任何好的答案 而且我自己似乎无法让它发挥作用 我正在寻找的是设置开始时间 结束时间 然后迭代给定时间间隔之间的一组时间 例如 上午 9 00 下午 5 00 是开始时间 这些
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p

随机推荐