【问题标题】:How to extract text from a particular point in string using sed?如何使用 sed 从字符串中的特定点提取文本?
【发布时间】:2016-07-29 05:42:40
【问题描述】:

我想使用 sed 将单个字符串分成两个不同的字符串。

例如:

STRING := folder1_test.abc_xxx

STRING1 := folder1_test

STRING2 := abc_xxx

or 

STRING := folderB_test folderA_test.yyyy_xx 

STRING1 := folderB_test folderA_test

STRING2 := yyyy_xx

所以无论在点(。)之前是什么,我都希望在第一个字符串中,在点(。)之后,我希望在第二个字符串中。

仅适用于sed 命令。正如我在 makefile 实现中使用的那样。

【问题讨论】:

  • cut -d. 就足够了吗?
  • 您能否详细说明如何使用 cut -d 特别是对于上述情况,因为我是 linux 新手。
  • 如果输入类似于:STRING := folderC_test folderD_rd.zzzz_yy folderA_test.yyyy_xx,您的预期输出是什么
  • @sat 不,不会像这样只有一个点,所以无论是在一个字符串中的点之前和第二个中的点之后 folderCV_test folderGHJ_test floderA_test.yyy_xxx跨度>

标签: linux bash sed grep cygwin


【解决方案1】:

从您的帖子中,我了解到您需要在 Makefile 中使用它(并且语法确认了这一点)。在这种情况下,这就是您所需要的:https://stackoverflow.com/a/8540718/3464942

例如:
STRING1 := $(firstword $(subst ., ,$(STRING)))
STRING2 := $(or $(word 2,$(subst ., ,$(STRING))),$(value 2))

【讨论】:

    【解决方案2】:

    一个命令行:

    使用tr cmd:

    echo 'folderB_test folderA_test.yyyy_xx' | tr "." "\n"
    # gives folderB_test folderA_test
    #       yyyy_xx
    

    使用剪切(将分隔符设置为 . 并显示字段 1 (-f1)):

    echo 'folderB_test folderA_test.yyyy_xx' | cut -d. -f1
    # gives folderB_test folderA_test
    

    使用剪切(将分隔符设置为 . 并显示字段 2 (-f2)):

    echo 'folderB_test folderA_test.yyyy_xx' | cut -d. -f2
    # gives yyyy_xx
    

    将结果存储在数组中并读取:

    #!/bin/bash
    
    IN="bla@some.com;john@home.com"
    
    #With tr cmd:
    arr=$(echo $IN | tr ";" "\n")
    
    #With sed cmd:
    arr=$(echo $IN | sed 's/;/\'$'\n/g')
    
    for x in $arr
    do
        echo "$x"
    done
    

    给予:

    bla@some.com
    john@home.com
    

    【讨论】:

      【解决方案3】:

      使用parameter expansion

      $ str='folder1_test.abc_xxx'
      $ echo "${str%.*}"
      folder1_test
      $ echo "${str#*.}"
      abc_xxx
      
      $ str='folderB_test folderA_test.yyyy_xx'
      $ echo "${str%.*}"
      folderB_test folderA_test
      $ echo "${str#*.}"
      yyyy_xx
      

      根据需求将echo替换为变量赋值

      $ string='folderB_test folderA_test.yyyy_xx'
      $ string1="${string%.*}"
      $ echo "$string1"
      folderB_test folderA_test
      $ string2="${string#*.}"
      $ echo "$string2"
      yyyy_xx
      

      注意:用户定义的变量最好使用小写

      【讨论】:

        【解决方案4】:

        我想它会回答你的问题。

        sed 's/\(^\(.*\)\.\(.*\)$\)/STRING : \1\nSTRING 1: \2\nSTRING 2: \3/g'

        例如:

        sed 's/(^(.).(.)$)/STRING : \1\nSTRING 1: \2\nSTRING 2: \3/g'

        folderB_test folderA_test.yyyy_xx //输入

        STRING : 文件夹B_test 文件夹A_test.yyyy_xx

        STRING 1:文件夹B_test 文件夹A_test

        字符串 2:yyyy_xx

        【讨论】:

          猜你喜欢
          • 2015-06-07
          • 1970-01-01
          • 2012-03-30
          • 2012-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-31
          相关资源
          最近更新 更多