6

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

sed 命令之一如下:

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

事实证明这是有问题的,因为它会破坏任何还包含破折号的资源请求(我使用 : 作为 awk 语句的分隔符)。

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

任何想法都非常感谢。

4

4 回答 4

2

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

awk '{target=substr($0,1,10); gsub(/-/,":",target); print target substr($0,11)}' file
于 2012-11-21T19:36:56.617 回答
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
 ::::::::::----------------------
于 2012-11-22T05:54:17.303 回答
1

我不确定 make sed 本身是如何做到的,但是,我知道您可以输入 sed 前 10 个字符,然后将其余字符粘贴回去,如下所示:

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

于 2012-11-21T19:43:20.470 回答
0

您可以执行以下操作:

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

cut 语句只占用该文件中每行的前 10 个字符。其输出应通过管道传输到文件中。截至目前,它只会输出到您的终端

于 2012-11-21T19:35:53.790 回答