2012-11-21 22 views
6

私はsedをシェルスクリプトの一部として実行して、バインドログをデータベースに挿入するためにクリーンアップします。SEDを行の最初の10文字に制限する

のsedコマンドの一つは以下の通りです:

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

これは、それは(私が使用しているにもダッシュを含むすべてのリソース要求を乱すとして問題があることが判明:awkの文の区切り文字としてさらに下に)。

私の質問は、上記のsedコマンドを行の最初の10文字に限定するにはどうすればよいですか?私はこれを行う特定のスイッチは見ていませんでした。私は、RegExで動作するものを開発することから始めることさえできません。パターンがリソース要求の一部である可能性があるので、正規表現を使用して前の数値と一致させることはできません。ちょっと、#### - ## - ##のパターンマッチングを使用することすらできません。なぜなら、やはりリソースの一部になる可能性があるからです。

アイデアは大変ありがとうございます。

答えて

2

にだけ出力されます:私はよく分からない

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

先生、私はそれをやるつもりだと思います。どうもありがとうございました! – MikeH

+2

または(テストされていない) 'perl -pe 'substr($ _、0、10)=〜s /:/ -/g' file' – tripleee

+0

@tripleee:あなたの(テストされていない)パールを知らない)。 –

0

あなたは、次の操作を行うことができます

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

カットstatemntは、そのファイル内の各行の最初の10個の文字になります。その出力はファイルにパイプされるべきです。今のところ、それは、awkを持つシンプルな端末[ほとんど常に]現在、

+2

私はOPを変更したいTHINK - 「長いラインのちょうど最初の10文字で秒、10文字までの行を切り捨てて、すべてを変更しないで「」 - "s。また、sedの "-i"が修正するファイルがないとどうなるのだろうか... ... –

1

はどのようにsedのは、それはそれ自体が、しかし、私はあなたのことを知っていますか作ります養うことができます最初の10の文字がそうのように、後ろに残りの部分を貼り付けsedを:

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

+0

これはファイルにではなくスクリーンに出力を吐き出しますが、これもうまくいく可能性があります。投稿に感謝します:) – MikeH

2

私は最短のソリューションを考えると、おそらく最も単純ではなく、awkの[区]よりも、自分自身のsedによって提供されています。

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

説明:

  • (h)はで
  • (S)(パターン全体のスペースに)置換を行う
  • (G)ホールドスペースを追加し、ホールドスペースにすべてをコピーします\nセパレータ
  • (秒)\nの後の10番目までの文字を削除しますが、最初の10個は保持してください。

いくつかのテストコード:

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

Good!おそらく、若干の改良がありました。/// /; G; s/^ \(。\ {10 \} \)* \ n。\ {10 \}/\ 1/'' – potong

+0

@potong : はい。それで合っています。 *しかし、いくつかの古いシステムはこの構文をサポートしていません。 *そしてそれはあまり明確ではない。 –

+0

@potong:しかし、あなたの解答は7文字(不要な^は無視しています)で、私よりも*短くなります。 'y 'は1文字を保存しました。 –

関連する問題