将SED限制为一行的前10个字符

时间:2012-11-21 19:27:58

标签: bash sed

我正在运行sed作为shell脚本的一部分来清理绑定日志以插入数据库。

其中一个sed命令如下:

sed -i 's/-/:/g' $DPath/named.query.log

这结果是有问题的,因为它会破坏任何也包含破折号的资源请求(我正在使用:作为awk语句的分隔符,进一步向下)。

我的问题是如何将上面的sed命令限制为只有行的前十个字符?我没有看到一个特定的开关来做到这一点,而且我还远远不够好用RegEx开始开发一个有效的开关。我不能只使用正则表达式匹配前面的数字,因为模式可能是资源请求的一部分。哎呀,我甚至不能使用#### - ## - ##的模式匹配,因为它再次成为资源的一部分。

非常感谢任何想法。

4 个答案:

答案 0 :(得分:2)

使用awk [几乎总是]更简单:

awk '{target=substr($0,1,10); gsub(/-/,":",target); print target substr($0,11)}' file

答案 1 :(得分:2)

我认为最短的解决方案,也许是最简单的解决方案,是由sed本身提供的,而不是awk [ward]:

 sed "h;s/-/:/g;G;s/\(..........\).*\n........../\1/"

说明:

  • (h)将所有内容复制到保留空间
  • (s)进行替换(到整个模式空间)
  • (G)使用\n分隔符
  • 附加保留空间
  • (s)删除\n之后的第十个字符,但保留前十个字符。

一些测试代码:

 echo "--------------------------------" > foo
 sed -i "h;s/-/:/g;G;s/\(..........\).*\n........../\1/" foo
 cat foo
 ::::::::::----------------------

答案 2 :(得分:1)

我不确定make sed是如何做到的,但是,我知道你可以给前10个字符加上sed,然后将其余部分粘贴回来,如下所示:

paste -d"\0" <(cut -c1-10 $DPath/named.query.log | sed 's/\-/:/g') <(cut -c11- $DPath/named.query.log)

答案 3 :(得分:0)

您可以执行以下操作:

cut -c 1-10 $DPath/named.query.log | sed -i 's/-/:/g'

剪切状态仅占用该文件中每行的前10个字符。它的输出应该在一个文件中传送。截至目前,它只会输出到您的终端