linux中的子串基于第一次出现

时间:2018-02-16 05:14:57

标签: linux string unix

我在文件中有一个原始未格式化的字符串,如下所示。

"],"id":"1785695Jkc","vector":"profile","
"],"id":"jashj24231","vector":"profile","
"],"id":"3201298301","vector":"profile","
"],"id":"1123798749","vector":"profile","

我想只提取下面的id值

1785695Jkc

我尝试了下面的命令

grep -o -P '(?<="],"id":").*(?=",")' myfile.txt >new.txt

但是最后一次出现",",如下所示

1785695Jkc","vector":"profile

但我只需要在第一次出现时拆分。

3 个答案:

答案 0 :(得分:0)

sed 's/"],"id":"\(.*\)","vector.*/\1/' myfile.txt

假设所有行都以"],"id":"开头,如输入所示。 哦,这是GNU sed btw,你的sed可能会使用扩展的正则表达式,在这种情况下会丢失括号的引用。

答案 1 :(得分:0)

您可以使用剪切

仅提取所需的列
.find_next_siblings

第一个剪切将采用id值对(“id”:“jashj24231”),第二个剪切将从中提取值(“jashj24231”)。最后 tr 删除封闭的引号。

答案 2 :(得分:0)

只提取上面的之类的id值,它们似乎是长度为10的字母数字字符串,请使用:

$ awk 'match($0,/[[:alnum:]]{10}/){print substr($0,RSTART,RLENGTH)}' file
1785695Jkc
jashj24231
3201298301
1123798749

如果值的定义如不正确,请更具体地说明要求。

顺便说一句,改变你的grep也有效:

$ grep -o -P '(?<="],"id":")[^"]*'