我正在运行sed作为shell脚本的一部分来清理绑定日志以插入数据库。
其中一个sed命令如下:
sed -i 's/-/:/g' $DPath/named.query.log
这结果是有问题的,因为它会破坏任何也包含破折号的资源请求(我正在使用:作为awk语句的分隔符,进一步向下)。
我的问题是如何将上面的sed命令限制为只有行的前十个字符?我没有看到一个特定的开关来做到这一点,而且我还远远不够好用RegEx开始开发一个有效的开关。我不能只使用正则表达式匹配前面的数字,因为模式可能是资源请求的一部分。哎呀,我甚至不能使用#### - ## - ##的模式匹配,因为它再次成为资源的一部分。
非常感谢任何想法。
答案 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/"
说明:
\n
分隔符\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个字符。它的输出应该在一个文件中传送。截至目前,它只会输出到您的终端