我正在处理许多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中,但任何暗示都会受到高度赞赏,因为我不是真正的专家。
答案 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"