代码之家  ›  专栏  ›  技术社区  ›  nickcrv06

在两个常量字符串之间提取单词

  •  0
  • nickcrv06  · 技术社区  · 2 年前

    我有以下字符串

    xml_srx_name="<name>SRX-NAME</name>"
    

    我正在尝试打印之间的文本>和< 所以它会打印出来 SRX-NAME

    我真的很接近,但这是我得到的: >SRX-NAME< 这就是我用这个命令所能做到的:

    $ cat $xml_srx_name | awk '/SRX-NAME/ {print $1}' | grep -oPz "(?s)>.*?<" | tr '\0' '\n'
    
    Output:
    >SRX-NAME<
    
    3 回复  |  直到 2 年前
        1
  •  1
  •   Tiago Peczenyj    2 年前

    你可以试试

    1. 添加 | tr -d '<>' 最后
    2. 使用 cat … |grep -o SRX-NAME
    3. 使用 cat … |cut -d \> -f 2 | cut -d \< -f 1
        2
  •  1
  •   TroopekYT    2 年前
    input="test<hello>text"
    
    rightpart=${input#*<}   # remove prefix up to "<" (included)
    output=${rightpart%>*}  # remove suffix from ">" (included)
    
    echo $output
    

    在bash中使用extglob,可以一步完成:

    shopt -s extglob
    input='test<hello>heythere'
    echo "${input//@(*<|>*)/}"
    

    这里@( <|> )将子字符串从开始匹配到<来自>的字符或子字符串;结束。使用//我们用一个空字符串替换所有这样的实例。

        3
  •  0
  •   Renaud Pacalet    2 年前

    如果最终得到一个复合命令 cat , awk , grep tr 你可能有一个反模式的好例子。 一个人就够了:

    $ xml_srx_name="<name>SRX-NAME</name>"
    $ awk -F'<|>' '/SRX-NAME/ {print $3}' <<< "$xml_srx_name"
    SRX-NAME
    

    或与 sed :

    $ sed '/SRX-NAME/s/.*>\(.*\)<.*/\1/' <<< "$xml_srx_name"
    SRX-NAME