2012-11-21 28 views
6

我將sed作爲shell腳本的一部分運行,以清理綁定日誌以便插入數據庫。將SED限制爲行的前10個字符

一個sed的命令如下:

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

這被證明是有問題的,因爲它破壞了任何資源請求還包括一個破折號(我使用的是:作爲分隔符的一個awk語句再向下)。

我的問題是我如何限制上面的sed命令只有行的前十個字符?我還沒有看到一個特定的開關可以做到這一點,而且我遠遠不夠使用RegEx,甚至無法開始開發一個可行的開關。我不能只用正則表達式來匹配前面的數字,因爲模式可能是資源請求的一部分。哎呀,我甚至無法使用#### - ## - ##的模式匹配,因爲它可能是資源的一部分。

任何想法,非常感謝。

回答

2

它[總是]使用awk簡單:

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:您的(未經測試的)評論對我無效(但我不知道Perl)。 –

0

你可以做到以下幾點:

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

切割statemnt只需要在該文件中的每一行的第一個字符10。它的輸出應該在一個文件中傳送。截至目前,它只會輸出到終端

+2

我認爲OP希望修改「 - 」 S在短短的較長線的前10個字符,而不是截斷行10個字符,然後修改所有「 - 「S。另外,我想知道sed的「-i」會不會修改文件。 –

1

我不知道如何讓SED做到這一點本身,但是,我知道,你可以養活sed的前10個字符,然後在剩下的重新粘貼,就像這樣:

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

+0

這會將輸出吐出到屏幕上而不是放到文件中,但這也可以起作用。感謝您的發帖。:) – MikeH

2

我想在最短的解決方案,也許最簡單的,由sed的本身提供的,而不是AWK [病房]:

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

說明:

  • (H)一切拷貝到保留空間
  • (一個或多個)執行替換(將整個圖案空間)
  • (G)附加的保持空間,與一個\n分隔符
  • (s)刪除字符到\n後的第十位,但保留前十位。

一些測試代碼:

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

好!也許略有改進'sed'h; y/- /:/; G; s/^ \(。\ {10 \} \)。* \ n。\ {10 \}/\ 1 \' – potong

+0

@potong : 是的,你是對的。 *但是*一些較舊的系統不支持這種語法。 *而且*不太清楚。 –

+0

@potong:但是你的解決方案比*更短*七個字符(忽略不必要的^)。 'y'保存了一個字符。 –