2

我正在处理许多 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 来“清理”线串并插入一些变量,这些变量在最后导入 postgres 中的数据的 bash 脚本中调用。这就是为什么我更愿意留在 sed 中的原因,但是任何提示都将不胜感激,因为我不是真正的专家。

4

2 回答 2

4

这对你有用(GNU sed):

sed -r 's/^.{8}(.{8})/\1;&/' file
于 2013-05-19T00:23:54.210 回答
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"
于 2013-05-19T00:24:11.647 回答