2016-07-29 54 views
0

我想使用sed将单个字符串分解为两个不同的字符串。如何使用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实现中使用的那样。

+0

将'切-d.'足够? – ewcz

+0

你可以更多地指定如何使用cut -d,特别是对于上面的情况,因为我是linux新手。 –

+0

如果输入是类似的东西,那么你的期望输出是什么:'STRING:= folderC_test folderD_rd.zzzz_yy folderA_test.yyyy_xx' – sat

回答

0

从你的文章中,我明白,你需要这一个Makefile(和语法确认这一点)。在这种情况下,这是你所需要的:https://stackoverflow.com/a/8540718/3464942

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

+0

谢谢@fara它适用于我。 –

0

一个命令行:

随着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 

随着切口(将分隔符设置为。并显示field2(-f2)):

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

结果存入数组和阅读:

#!/bin/bash 

IN="[email protected];[email protected]" 

#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 

给出:

[email protected] 
[email protected] 
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 

与变量赋值按规定

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

备注:用户自定义变量最好使用小写字母

0

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

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

例:

的sed的/(。^()()$)/ 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