Linux下如何用一个指定的字符串去分割另一个字符串?

Linux下如何用一个指定的字符串去分割另一个字符串?,第1张

Linux下可以用strstr()函数定位子串所在的位置,用来实现用子串分隔一个字符串。man strstr可以看函数相关介绍

$ man strstr

NAME

       strstr - locate a substring

SYNOPSIS

       #include <string.h>

       char *strstr(const char *haystack, const char *needle)

DESCRIPTION

       The  strstr()  function finds the first occurrence of the substring needle in the string haystack.  The terminating `\0' characters are not compared.

       strstr()函数实现从haystack串中,查找第一次出现的needle子串,只比较有效字符,结束符\0不算在内。

如:

#include <stdio.h>

#include <string.h>

int main()

{

    char s[]="abc@#123@#def@456@#ghi#789"

    char sub[]="@#"

    char *pc,*pb

    pb=pc=s  //pb指向字符串头

    while( pc=strstr(pc,sub) ) //查找匹配字符串位置

    {

        *pc='\0' //置字符串结束符

        puts(pb) //输出当前字符串

        pc+=strlen(sub) //跳过分隔符串

        pb=pc //pb指向新的起始位置

    }

    if ( pb )

        puts(pb)

    return 0

}

expect:expect是Unix系统中用来进行自动化控制和测试的脚本工具,常用于实现交互式任务的自动化。使用命令”dnf install expect -y”进行安装。脚本文件声明为”#!/usr/bin/expect”。

expect常用命令如下:

1.spawn+交互命令(如spawn ssh root@192.168.1.1):”spawn”是expect的初始命令,用于启动一个新的交互进程,之后所有的 *** 作都会在这个进程中进行。

2.set:定义变量/为变量赋值。使用语法:set 变量名 值。

3.puts:将变量值/字符串定向到本地标准输出文件(即定位到屏幕)。使用语法:puts “字符串/$变量名”

4.send_user:作用和使用方法类似于”puts”,区别在于”puts”会在输出内容的结尾自动追加一个换行符,而”send_user”不会。

5.send:向交互进程发送信息/命令(字符串和一些特殊符号,\r—回车,\n—换行,\t—制表符)。使用语法:send “信息/命令[\r]”。

6.[lindex $argv 数字]:表示外部传递参数的值,数字是n,就表示第n-1个参数。注:$argc表示外部传递参数的个数,也是一个值。

7.expect+字符串+{ 命令 }:将字符串与交换进程接收到的信息进行匹配。如果匹配成功(字符串是交换进程接收到的信息的一部分),执行包含在”{}”中的命令;如果匹配失败,不执行包含在”{}”中的命令。该命令有三种使用方法:

第一种:单分支模式

①expect 字符串 { 命令 }

解释:如果字符串与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串与交换进程接收到的信息匹配失败,timeout秒后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

②expect {

字符串{ 命令 }

timeout { 命令 }

}

解释:如果字符串与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串与交换进程接收到的信息匹配失败,timeout秒后执行包含在”{}”中的命令,之后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

第二种:多分支模式

①expect {

字符串1 { 命令 }

字符串2 { 命令 }

}

解释:如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并结束该expect命令;如果字符串1与交换进程接收到的信息匹配失败、字符串2与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串1、字符串2皆与交换进程接收到的信息匹配失败,timeout秒后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

②expect {

字符串1 { 命令 }

字符串2 { 命令 }

timeout { 命令 }

}

解释:如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并结束该expect命令;如果字符串1与交换进程接收到的信息匹配失败、字符串2与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并结束该expect命令;如果字符串1、字符串2皆与交换进程接收到的信息匹配失败,timeout秒后执行包含在”{}”中的命令,之后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

第三种:循环多分支模式(注:exp_continue命令只能出现在expect命令的匹配语句中,执行到exp_continue命令时,脚本会跳出当前expect命令,并重新执行该expect命令,直到expect命令通过不包含exp_continue命令的匹配语句结束、或expect命令匹配超时结束。)

①expect {

字符串1 { 命令exp_continue }

字符串2 { 命令 }

}

解释:如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并重新执行该expect命令;如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并重新执行该expect命令...;如果字符串1与交换进程接收到的信息匹配失败、字符串2与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串1、字符串2皆与交换进程接收到的信息匹配失败,timeout秒后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

②expect {

字符串1 { 命令exp_continue }

字符串2 { 命令 }

timeout { 命令 }

}

解释:如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并重新执行该expect命令;如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并重新执行该expect命令...;如果字符串1与交换进程接收到的信息匹配失败、字符串2与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串1、字符串2皆与交换进程接收到的信息匹配失败,timeout秒后执行包含在”{}”中的命令,之后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

8.timeout:timeout是expect中的一个关键字变量,用于控制expect命令的超时时间。需要注意的是,这个超时时间针对于整个expect命令,而不是针对于expect命令中的某条匹配语句。也就是说,只有expect命令中所有匹配语句都匹配失败后,才会开始计算超时时间。timeout变量值缺省为10(秒),我们可以通过”set timeout=值”的方式为其重新赋值,作用范围:本次赋值到下一次赋值间的所有expect命令。注:如果需要为timeout变量重新赋值,应在expect命令之外进行。

9.expect eof:该命令的作用是结束spawn交互进程,将命令行切回至运行脚本的主机(即从远端服务器登出)。

10.interact:缺省情况下,expect脚本执行完毕后会自动从远端服务器登出(即便没有显式地执行”expect eof”命令)。使用interact命令后,expect脚本执行完毕会继续保持当前状态,并将控制权移交给用户。

11.exit:结束该脚本。

expect中的if语句:

if { 条件表达式 } {

命令

}

if { 条件表达式 } {

命令

} else {

命令

}

expect中的while语句:

while { 条件表达式 } {

命令

}

expect中的for语句:

for { set i 1 } { $i <=10 } { incr i } {

命令

}

incr变量名 步长   ——变量自增

incr 变量名 -步长    ——变量自减

数学运算需使用let、expr等工具


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7200842.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-02
下一篇2023-04-02

发表评论

登录后才能评论

评论列表(0条)

    保存