如何使用sed从字符串中的特定点提取文本?

时间:2016-07-29 05:42:41

标签: linux bash sed grep cygwin

我想使用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

所以无论是在dot(。)之前我想要的第一个字符串和点(。)之后我想要第二个字符串中的那个东西。

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

4 个答案:

答案 0 :(得分:0)

一个命令行:

使用tr cmd:

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

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

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

使用cut(将分隔符设置为。并显示field2(-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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用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

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

答案 3 :(得分:0)

我认为它会回答你的问题。

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:folderB_test folderA_test.yyyy_xx

     

STRING 1:folderB_test folderA_test

     

STRING 2:yyyy_xx