我試圖使用後續替換幾個文件,逗號標籤:擊的sed在循環
#!/bin/sh
for i in *output_*.txt
do
sed 's/ /;/g' $i > $i
done
但它不是在輸出文件,因爲工作,我仍然有標籤分隔符。當我在沒有使用for循環的單個文件上使用它時,它才起作用。
任何幫助?
謝謝。
我試圖使用後續替換幾個文件,逗號標籤:擊的sed在循環
#!/bin/sh
for i in *output_*.txt
do
sed 's/ /;/g' $i > $i
done
但它不是在輸出文件,因爲工作,我仍然有標籤分隔符。當我在沒有使用for循環的單個文件上使用它時,它才起作用。
任何幫助?
謝謝。
你需要正確的腳本如下:
find . -name '*output_*.txt' | while read FILENAME; do
(sed -e "s/\\t/;/g" <${FILENAME} >${FILENAME%.txt}.tmp) && (mv ${FILENAME%.txt}.tmp ${FILENAME});
done
這個腳本有幾個重要的特點:
它發現在所謂*output_*.txt
所有文件當前目錄和所有子目錄。如果您不要遞歸到子目錄,然後使用:
find . -maxdepth 1 -name '*output_*.txt' | while read FILENAME; do
的第一線。
它如果sed
遇到錯誤,則不覆蓋您的原始輸入文件。 sed
生成其輸出到一個臨時文件(<filename>.tmp
),它只會取代原始文件,如果它成功。
正如其他海報指出的那樣,製表符由\t
在sed
腳本表示。
由該腳本執行的示例變換如下(該序列<tab>
表示標籤字符):
輸入:
<tab><tab><tab><tab><tab>line 1<tab><tab> <tab><tab><tab>line 2<tab><tab> <tab><tab>line 3<tab><tab> <tab><tab><tab>line 4<tab><tab> <tab><tab><tab><tab><tab>line<tab><tab> 5
輸出:
;;;;line 1;;
;;;line 2;;
;;line 3;;
;;;line 4;;
;;;;;line;; 5
如何你插入製表符? bash將選項卡視爲完成,這可能會導致問題。大多數sed支持一個製表符,否則'tab = $'\ t''然後是'sed's/$ tab /;/g「$ i> $ i' – cdarke
它看起來像是用空格替代分號。嘗試使用'sed -i's/\ t /,/ g'$ i'。 '-i'選項表示*就地*。 –
嘗試使用啓用就地替換的sed的-i標誌。 – jpe