如何使用sed分割字符串?

问题描述 投票:2回答:3

我是bash脚本的新手。我想分割以下字符串,

chr14:81370042-81371098(+)

进入

chr14 81370042 81371098 +

chr14:81370042-81371098(-)

进入

chr14 81370042 81371098 -

[请告诉我如何使用在两种情况下都可以使用的命令来做到这一点。

我尝试过,cat a.tsv | tr -s ':' '\t' | sed "s/\t[0-9]+.*[0-9]+/[0-9]+\t[0-9]/g",它不起作用。

谢谢。

bash shell awk sed command
3个回答
2
投票

sed可能起作用:

sed -E 's/[^-+_[:alnum:]]+/ /g; s/ +$//; s/-(.)/ \1/g' <<< 'chr14:81370042-81371098(+)'

chr14 81370042 81371098 +

否则:

sed -E 's/[^-+_[:alnum:]]+/ /g; s/ +$//; s/-(.)/ \1/g' <<< 'chr14:81370042-81371098(-)'

chr14 81370042 81371098 -

[[^-+_[:alnum:]]+匹配1个或多个不是-+_和字母数字的字符。


3
投票
$ sed 's/[():]/ /g; s/-/ /' file
chr14 81370042 81371098 +
chr14 81370042 81371098 -

或者如果您不喜欢留下的结尾空白字符,则:

$ sed 's/[(:]/ /g; s/)//; s/-/ /' file
chr14 81370042 81371098 +
chr14 81370042 81371098 -

1
投票

使用显示的示例进行了书面和测试,请尝试以下。

echo "chr14:81370042-81371098(+)" | awk '{gsub(/:|-|\(|\)/,OFS)} 1'

[第二解决方案:awk中使用字段分隔符。

echo "chr14:81370042-81371098(+)"  | 
awk -v FS=':|-|\(|\)' '{
  $1=$1
  sub(/ +$/,"")
}
1'
© www.soinside.com 2019 - 2024. All rights reserved.