打印行中的第一个数字,后跟制表符和没有数字的行

Print the first number from line followed by tab and the line without the number

我很难用 sed 完成这项任务。

示例输入:

X(996002) dsafsafdsfdsfds dsfdsfds dsfd ds
Y(300342) dsfdsfhdsfhsa dsf;dsjfds f 15 16 .
"(1200479) dsfkjdsfhjfds dsfdsj sd "

示例输出:

996002 TAB ) dsafsafdsfdsfds dsfdsfds dsfd ds
300342 TAB ) dsfdsfhdsfhsa dsf;dsjfds f 15 16 .
1200479 TAB ) dsfkjdsfhjfds dsfdsj sd "

到目前为止,我有以下 sed:

sed -e 's/^.*\([0-9]*\)\(.*?\)$/ \t /gp' textfile.txt

但我想我不明白如何让它发挥作用。

您可以使用:

sed -i.bak 's/^[^[:digit:]]*\([[:digit:]]\+\)/\t /' file
996002   ) dsafsafdsfdsfds dsfdsfds dsfd ds
300342   ) dsfdsfhdsfhsa dsf;dsjfds f 15 16 .
1200479  ) dsfkjdsfhjfds dsfdsj sd "

解释:

  • -i.bak - 内联编辑,使用 .bak 扩展名
  • 保存原始文件
  • ^ - 匹配 linse 开始
  • ^[^[:digit:]]\+ - 在开头匹配 1 个或多个非数字
  • \(...\) - 将包含的内容分组到捕获组 #1
  • \([[:digit:]]\+\) - 在组 #1
  • 中捕获 1 个或多个数字
  • \t - 由第 1 组替换,后跟制表符和 space

这对你有用吗?

 sed 's/.*(\([^)]*\)/\t/' file

使用您的输入文件:

kent$  cat f
X(996002) dsafsafdsfdsfds dsfdsfds dsfd ds
Y(300342) dsfdsfhdsfhsa dsf;dsjfds f 15 16 .
"(1200479) dsfkjdsfhjfds dsfdsj sd "

kent$  sed 's/.*(\([^)]*\)/\t/' f
996002  ) dsafsafdsfdsfds dsfdsfds dsfd ds
300342  ) dsfdsfhdsfhsa dsf;dsjfds f 15 16 .
1200479 ) dsfkjdsfhjfds dsfdsj sd "

使用awk

awk -F".[(]" '{sub(/)/,"\t)", );print }' file
996002  ) dsafsafdsfdsfds dsfdsfds dsfd ds
300342  ) dsfdsfhdsfhsa dsf;dsjfds f 15 16 .
1200479 ) dsfkjdsfhjfds dsfdsj sd "