【问题标题】:How to extract a string after matching characters from a variable in shell script [duplicate]如何从shell脚本中的变量匹配字符后提取字符串[重复]
【发布时间】:2021-02-12 03:11:55
【问题描述】:

我有一个文件,其文本如下

classA = Something
classB = AB1234567
classC = Something more
classD = Something Else

目标:
使用 shell 脚本,我想从上面的完整文本中读取 AB1234567 的文本。

首先,我可以在我的 shell 脚本中使用以下逻辑读取上述文本的第二行:

secondLine=`sed -n '2p' my_file`;
echo $secondLine;

secondLine 输出 classB = AB1234567。如何在我的 shell 脚本中从 classB = AB1234567 中提取 AB1234567

问题:
考虑到AB 在我处理的所有文件的文本的特定部分中很常见,我怎样才能让sed 读取AB 之后的所有数字?

请注意classB = AB1234567 可以以空格或换行符结尾。 我需要把它变成一个变量

【问题讨论】:

  • 不知道为什么我的问题被否决了,但无论如何。非常感谢您的回答。

标签: linux shell awk sed sh


【解决方案1】:

请您尝试关注,awk 中的外观应该很容易。考虑到您要打印第二行并仅打印最后一个字段中的数字。

secondLine=$(awk 'FNR==2{sub(/[^0-9]*/,"",$NF);print $NF}' Input_file)

【讨论】:

  • 谢谢。您能否使用变量secondLine 并将其放入另一个名为searchedtext 的变量中?
  • @AdeleGoldberg,完成,如果这对您有帮助,请告诉我?
  • 这也可以。困惑选择哪个答案。那里有如此聪明的头脑!非常感谢
  • @AdeleGoldberg,欢迎您,取决于您选择哪个答案,我们都在这里学习,欢呼和快乐的学习和分享:)
【解决方案2】:

试试:

sed '2{ s/^classB = \(AB[^ ]*\) *$/\1/;q } ;d' your_fileName
  • 2 是行号。
    • {打开一个sed组命令。
      • s/ 替换下面的匹配项
        • ^ 是行首的锚
        • \(...\) 被称为捕获组,\1 作为其反向引用
        • [^ ]* 表示任何字符,但不是空格
        • \(AB[^ ]*\) 捕获 AB 后跟任何内容,直到看到第一个空格但不是空格(反向引用是 \1
        • * 表示零个或多个空格
        • $ 是行尾的锚
      • / 下方有
        • \1 上述捕获组的反向引用
      • /替换结束
      • q 退出以避免不必要地读取文件的其余部分
    • }关闭组命令。
  • d 删除第 2 行之前的任何其他行。

进入变量:

your_variableName=$(sed '2{ s/^classB = \(AB[^ ]*\) *$/\1/;q } ;d' your_fileName)

【讨论】:

    【解决方案3】:

    你可以试试这个awk:

    awk -F ' *= *' '$1 ~ /B$/ { print $2 }' file
    
    AB1234567
    

    【讨论】:

    • 谢谢。您能否使用变量secondLine 并将其放入另一个名为searchedtext 的变量中?
    • 你可以通过secondLine=$(awk -F ' *= *' '$1 ~ /B$/ { print $2 }' file) 将输出放入变量中
    【解决方案4】:

    我不能 100% 确定这就是您要查找的内容,但如果您知道文件中只有一个以 AB 开头的元素,这会将其放入一个变量中:

    $ cat sample.txt 
    classA = Something
    classB = AB1234567
    classC = Something more
    classD = Something Else
      
    $ x=$(perl -ne 'print if s/^.*\s+(AB\S+)\s*$/$1/' sample.txt)
     
    $ echo "the variable is: $x"
    the variable is: AB1234567
    
    

    正则表达式的解释:

    • ^ 行首
    • .* 任何东西
    • \s+ 任意数量的空格
    • (AB\S+)AB 开头的任何内容,后跟非空格
    • \s*$ 零个或多个空格,后跟行尾。

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多