linux shell script 使用正则表达式替换查找文本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell script 使用正则表达式替换查找文本相关的知识,希望对你有一定的参考价值。

subnet 125.217.241.0 netmask 255.255.255.128
option domain-name-servers 202.38.193.33,202.112.17.33;
option domain-name "scut.edu.cn";
option routers 125.217.241.126;
option broadcast-address 125.217.241.127;
default-lease-time 600;
max-lease-time 6000;
pool
allow members of "allocation-class-19664";
range 125.217.241.1 125.217.241.125;



这是dhcpd.conf文件里的,我要写一个shell script,能够实现替换
subnet
netmask
option domain-name-servers
option domain-name
option routers
option broadcast-address
default-lease-time
max-lease-time
allow members of "allocation-class-19664"
range
这些字段,意思就是,执行这个script的时候,会询问我subnet是?例如我输入192.168.0.0,然后就能把我输入的替换了文件里的125.217.241.0,其他的字段都能实现这样的替换
请大家帮帮忙?

ps:这个dhcpd.conf文件有10000行,我还要准备找到对应的这一行subnet 125.217.241.0 netmask 255.255.255.128,然后再进行替换
这用正则表达式要怎么写呢?请大家再帮下忙

我也写个例子:
#!/bin/sh
read -p "Pls input subnet: " $subnet
read -p "Pls input netmask: " $netmask
sed -i "s_subnet_subnet $subnet netmask $netmask_" dhcpd.conf
----------------------------------------------------------------------------------------
更新一下。
read -p "Pls input subnet: " $subnet
read -p "Pls input netmask: " $netmask
sed -i “s/^\(.*subnet \).*\( netmask \).*[0-9]\(.*\)$/\1$subnet\2$netmask\3/” dhcpd.conf

sed中正则匹配时可以在不需要变化的文本两边插入带反斜杠的圆括号来定义区域,然后通过区域号\x(x从1开始)来引用这些由圆括号界定的区域。这样就可以实现只改变部分区域而另一部分保持不变。
参考技术A grep '^[0-9]\$' test.txt | grep '^[1-9]'

如果是变量

echo $var | grep '^[0-9]\$' | grep '^[1-9]'

$表示行尾

这个正则不匹配 12a 这样的字符串

你的变量内容是什么样的?

我用来测试的 test.txt 的内容:
123
321
123212
001
010
100
10000
0011
10101
1101
1
2
3
11
22
33
1a
2a
参考技术B read shu
sed -i "s#max-lease-time.*;#max-lease-time $shu;#g" dhcp.conf

只给你写个例子

linux基础:shell中的正则表达式用法大全

在Linux系统中,正则表达式(RegularExpression)是通过一些特殊字符的排列,用以查找、替换、删除等操作的强大工具,对于每一个Linux用户,都是非常重要的。
在现有的系统中,正则表达式也分为基础正则表达式(grep),扩展正则表达式(egrep)。在正式了解正则表达式之前,先了解一些相关的字符概念,它们在正则表达式中都有特殊的含义与用法。

对于基础正则表达式grep而言,每个特殊字符分别有不同的匹配:

1.字符匹配:


        .     :匹配任意单个字符
       [ ]    :匹配范围内的任意单个字符,如[0-9],[a-z],[A-Z]...
       [^ ]   :匹配范围外的任意单个字符
        [:digit:]:匹配任意单个数字,0-9
     [:lower:]:匹配任意单个小写字母,a-z
     [:upper:]:匹配任意单个大写字母,A-Z
     [:alpha:]:匹配任意单个字母,包含大小写a-z,A-Z
     [:alnum:]:匹配任意单个字符,包含a-z,A-Z,0-9
     [:space:]:匹配任意会产生空白的字符

 

2.次数匹配:用在要指定其出现的次数的字符后面,用以限制其前面的字符要出现的次数;
     
     *:匹配前面的字符任意次(0,1或多次);
      grep "x*y":
       xxxyabc:匹配3次
       yabc:匹配0次
       abcxy:匹配一次
       abcy:匹配0次

     .*:匹配任意长度的任意字符;

     \+:匹配前面的字符至少1次;
      grep "x\+y":
       xxxyabc:匹配3次
       yabc:不匹配
       abcxy:匹配一次
       abcy:不匹配 

     \?:匹配前面的0次或1次,即前面的字符可有可无;
      grep "x\?y":
       xxxyabc:匹配1次
       yabc:匹配0次
       abcxy:匹配1次
       abcy;匹配0次 

     \{m\}:其前面的字符出现m次,m为非负整数;
      grep "x\{2\}y":
       xxxyabc:匹配
       yabc:不匹配
       abcxy:不匹配
       abcy:不匹配 

     \{m,n\}:其前面的字符出现m次,m为非负整数;[m,n]
      \{0,n\}:至多n次;
      \{m,\}:至少m次;
      \{m,n\}:前面的字符至多出现n次,至少m次
      
3.位置锁定:限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的特定位置;
     
     ^:行首锁定;用于模式的最左侧,^PATTERN
     $:行尾锁定;用于模式的最右侧,PATTERN$
      ^PATTERN$:要让PATTERN完全匹配一整行;
      ^$:空行;
      ^[[:space:]]*$:以空格为开头的,以任意字符为结尾的行
      
       单词锁定:由非特殊字符组成的连续字符(字符串)都称为单词;
 
     \<或\b:词首锁定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN
     \>或\b:词尾锁定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b
      \<PATTERN\>:单词锁定;

以下通过一些例子来介绍相关用法:

本文出自 “11283159” 博客,请务必保留此出处http://11293159.blog.51cto.com/11283159/1749739

以上是关于linux shell script 使用正则表达式替换查找文本的主要内容,如果未能解决你的问题,请参考以下文章

shell script 在if 的判断条件正则表达式=~中引号问题

Linux Shell编程 - 正则表达式

Linux学习8之Shell编程--基础正则表达式

Linux Shell编程

如何在 linux shell 脚本中使用正则表达式搜索文件 [关闭]

linux基础:shell中的正则表达式用法大全