sed从固定位置复制子串并将其复制到行前面

时间:2013-05-19 00:11:12

标签: bash csv sed substring

我正在处理许多csv文件,我找不到sed在固定位置选择子串的方法(字符9-16)并在开头复制它线。

这就是我所拥有的:

ABC09638006924340017;SOME_TEXT;SOME_OTHER_TEXT

这就是我需要的:

00692434;ABC09638006924340017;SOME_TEXT;SOME_OTHER_TEXT

sed中的以下代码给出了我需要的子字符串(00692434)但是会覆盖整行:

sed 's/^.{8}(.{8}).*/\1/')

我已经在使用sed来“清理”线串并插入一些变量,这些变量在bash脚本中调用,最后在postgres中导入数据。这就是为什么我宁愿留在sed中,但任何暗示都会受到高度赞赏,因为我不是真正的专家。

2 个答案:

答案 0 :(得分:4)

这可能适合你(GNU sed):

sed -r 's/^.{8}(.{8})/\1;&/' file

答案 1 :(得分:4)

您需要转义大括号(\{\})以及括号(\(\)),并在替换中附加原始字符串(&):

text="ABC09638006924340017;SOME_TEXT;SOME_OTHER_TEXT"
echo $text | sed "s/^.\{8\}\(.\{8\}\).*/\1;&/"

输出:

00692434;ABC09638006924340017;SOME_TEXT;SOME_OTHER_TEXT

由于您想要在固定位置提取固定长度的子字符串,您也可以使用bash-builtins来执行此操作:

text="ABC09638006924340017;SOME_TEXT;SOME_OTHER_TEXT"
echo "${text:8:8};$text"