2016-09-29 52 views
1

我在這裏是新的,我有一個問題,我無法弄清楚。我試圖用幾乎相同的行替換* .txt文件中的一行,但進行了修改。我仍然收到錯誤或輸出文件沒有改變。你能幫我麼?塞德替換線從變量

腳本:

var1=`grep "keyS.log\" type=" /C/tst/tst.txt` 
x="<\!--" 
if echo "$var1" | grep -q "$x"; then 
    echo "Already disabled"; 
else 
prefix='<!-- ' 
sufix='-->' 
modified=`echo "${var1/[[:space:]]/}" | sed 's:^.\(.*\).$:\1:'` 
final="${prefix}${modified}${sufix}" 
echo "${final}" 
`sed -i 's/${var1}/${final}/g' /C/tst/tst.txt` 
fi 

行我想在文件中修改是這樣的:

<category="keyS" priority="1" appender="/tmp/keyS.log"/> 

,應該是這樣的:

<!-- category="keyS" priority="1" appender="/tmp/keyS.log"/--> 

有更多行從類別開始,在appender =後面可以有不同的路徑,因此它是動態的。

錯誤是這樣的:sed的 :1: 「/C/tst/tst.txt」:未定義標籤 'ST/tst.txt'

當我試圖使用

cat /C/tst/tst.txt | sed 's/${var1}/${final}/g' >> /C/tst/tsttmp.txt 

線在tsttmp.txt中沒有改變,我也失去了行間距,所以整個文本是一行。

預先感謝您的任何幫助

斯坦尼斯

回答

1

如果我明白你的問題吧,下面是你需要什麼:

sed 's/^<\(category=.*keyS.log.*\)>$/<!-- \1-->/' /C/tst/tst.txt 

戰略經濟對話模式

  • 外觀對於以<開頭的行,然後是category。這將忽略,如果已經註釋掉,因爲在那種情況下<將不會跟着category
  • 放入()的圖案將存儲爲\1(依此類推)。我們在這裏尋找keyS.log
  • 如果上面兩個匹配項發生,替換部分將添加html樣式註釋。

注意:我沒用過sed的內聯替換-i選項。一旦你確定這適用於你,你可以使用它。

2

shell是用於調用工具和操作文件/進程,而不是用於操作文本。標準的UNIX通用文本操作工具是awk。翻譯您的shell腳本到AWK是:

awk ' 
/keyS.log" type=/ { 
    if (/<!--/) { 
     print "Already disabled" |"cat>&2" 
    } 
    else { 
     sub(/</,"<!-- ") 
     sub(/>/,"-->") 
    } 
} 
1' /C/tst/tst.txt 

使用awk -i inplace 'script' file與GNU AWK或awk 'script' file > tmp && mv tmp file與其他awks覆蓋原文件。

請注意,您發佈的示例輸入中不存在您的腳本keyS.log" type=中的正則表達式,因此您必須將其更改爲發佈的示例輸入準確的情況。