AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 456991
Accepted
Yimin Rong
Yimin Rong
Asked: 2018-07-19 05:16:52 +0800 CST2018-07-19 05:16:52 +0800 CST 2018-07-19 05:16:52 +0800 CST

使用自定义实用程序搜索和替换

  • 772

我想运行一个实用程序来替换与正则表达式匹配的值。这意味着对于正则表达式的每个匹配项,调用包含匹配项的字符的实用程序。该实用程序的输出将替换原始字符。

出于说明目的,使用factor:

$ factor 230
230: 2 5 23

所以使用这个实用程序,我想挑选出整数,factor用整数调用,并用 的输出替换原始整数factor。

这是我对示例输入的期望:

$ [code] <<< "Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes."
Given the numbers with factors: 27: 3 3 3, 13: 13, 230: 2 5 23, and 19: 19, it is evident which are primes.

我认为这可能有效,但它看起来像是在尝试直接解释输入。使用sed (GNU sed) 4.2.2.

$ sed -E 's/([0-9]+)/factor \1/ge' <<< 'Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes.'
sh: 1: Given: not found

显然我不明白这e面旗帜的作用。删除e显示正则表达式正确提取整数并将它们作为\1.

我尝试这样做awk:

$ awk '{r = gensub(/([0-9]+)/, system("factor \\1"), "g"); print r}' <<< 'Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes.'
1:
Given the numbers with factors: 0, 0, 0, and 0, it is evident which are primes.

我不确定它1:来自哪里,但很明显它只是打印来自system. 似乎没有办法从awk.

我要求的是使用核心实用程序的可能吗?

awk sed
  • 4 4 个回答
  • 87 Views

4 个回答

  • Voted
  1. choroba
    2018-07-19T05:31:31+08:002018-07-19T05:31:31+08:00

    在 Perl 中可能。使用split、map、scalar、lc、reverse、ucfirst、join。由于匹配的逗号和上下文敏感性,比我原先想象的要复杂一些。

    #!/usr/bin/perl
    use warnings;
    use strict;
    
    sub rev {
        my ($string) = @_;
        my @words = split /(\W+)/, $string;
        my @caps = map scalar(/^[[:upper:]]/), @words;
        $_ = /\w/ ? lc reverse : $_ for @words;
        shift @caps and $_ = ucfirst for @words;
        return join "", @words
    }
    
    use Test::More tests => 1;
    my $r = rev('Hello, my name is Yimin Rong.');
    is $r, 'Olleh, ym eman si Nimiy Gnor.';
    
    • 1
  2. Best Answer
    Rakesh Sharma
    2018-07-21T10:09:26+08:002018-07-21T10:09:26+08:00

    运行以下命令:

     perl -pe 's/(\d+)/qx(factor $1) =~ s|\n||r/ge'  input-file.txt
    

    您的 sed 命令不起作用的原因是因为 sed 将执行整个模式空间,这与 Perl 不同,Perl 与您的想法和执行方式一致,与 s/// 命令的 rhs 一样多,并且仅替换那么多与命令输出。

    这就是为什么如果您注意到 sed 抄袭了 abt “Given:” utility not found 的原因。Given 是你的模式空间的开始。高温高压

    • 1
  3. Raman Sailopal
    2018-07-19T05:57:02+08:002018-07-19T05:57:02+08:00

    试试下面的 awk 解决方案:

    echo "Hello" | awk '{ for ( i=length($0);i>0;i-- ) { if (i == length($0) ) { printf "%s",toupper(substr($0,i,1)) } else {  printf "%s",tolower(substr($0,i,1)) } } printf "\n" }'
    

    从最后一个字符开始逐个字符地获取单词的每个字母。如果它是最后一个字符,则转换为大写并打印,否则打印小写。

    • 0
  4. Rakesh Sharma
    2018-07-21T10:07:20+08:002018-07-21T10:07:20+08:00

    运行以下命令:

    perl -pe 's/(\d+)/qx(factor $1) =~ s|\n||r/ge'  input-file.txt
    
    • 0

相关问题

  • 如何改进这个字符转换脚本?

  • 如何删除两行之间的单行

  • 重新排列字母并比较两个单词

  • 多行文件洗牌

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve