2017-07-16 61 views
-1

我有一個svg文件的文件夾,稱之爲svg。在很多SVG文件的根目錄中添加屬性

爲他們每個人的第一行,看起來像:

<ns0:svg xmlns:ns0="http://www.w3.org/2000/svg" height="296.90mm" version="1.2" viewBox="0 0 118.6170 167.6220" width="210.10mm"> 

我想將它更改爲:

<ns0:svg xmlns:ns0="http://www.w3.org/2000/svg" height="296.90mm" version="1.2" viewBox="0 0 118.6170 167.6220" width="210.10mm" shape-rendering="crispEdges"> 

所以,整個的一點是添加形狀渲染=」 crispEdges「到每個文件。但是,我有很多這些文件(數十萬),所以我需要它儘可能高效。

有沒有人知道這樣做的快速方法,無論是從python或從Ubuntu終端?

謝謝!

+0

你必須證明你自己的努力來解決它......足以與'sed' ..你可以指定你只需要改變一號線,使用正則表達式來代替簡單的'>'在所需字符串的行末,使用'-i'選項執行就地編輯等等......請參閱https://stackoverflow.com/tags/sed/info – Sundeep

+0

我之前沒有使用過這些工具。我可以用Python做,但對我來說效率不高。 – TheRevanchist

+0

然後在這裏添加Python代碼..如果有問題,我確定你會在這裏得到幫助...如果它運作良好,但你想知道改進的地方,請訪問https://codereview.stackexchange.com/ ...''以前沒有使用這些工具,那麼你將不得不開始學習...... – Sundeep

回答

1

很可能sed是一種最適合您的用途的工具。

sed -e -i 's/<ns0:svg\(.*\)>/<ns0:svg\1 shape-rendering="crispEdges" >/g' <files_you_want_to_update> 
+0

這似乎不適用於我。它不能識別-e命令,沒有它就說沒有輸入文件(儘管我在有svg文件的文件夾中)。 – TheRevanchist

+0

@TheRevanchist更新了答案,您需要指定要更新的文件。 –

+0

酷,我改變了你的代碼遍歷文件,它的工作就像一個魅力。我將解決方案放在OP中(因爲這裏的格式不太好),並接受你的答案。 感謝您的幫助! – TheRevanchist

1

如果您對awk還可以,那麼您也可以嘗試下面的內容。

awk -v s1="shape-rendering=\"crispEdges\"" '{sub(/>$/,FS s1 ">")} 1' Input_file > temp_file && mv temp_file Input_file 

編輯:添加的解釋與解決非班輪一個形式太在這裏。

awk -v s1="shape-rendering=\"crispEdges\"" '{      ##creating variable named s1 which will have value of string mentioned by OP. 
               sub(/>$/,FS s1 ">")##substituting last occurrence with FS s1 > with it in the line. 
              } 
              1      ##Writing 1 means making the condition TRUE and NOT mentioning any action here so by default print of current line will happen. 
              ' Input_file > temp_file \ ## Writing output of this into a temp_file then continuing the following command. 
              && mv temp_file Input_file## && means if previous commands is SUCCESSFUL then rename temp_file to Input_file 

EDIT2:按OP的要求,我根據.SVG文件改變我的代碼,它會保存單個INPUT_FILE本身的變化(如果有的話)。

awk -v temp_file="file" -v s1="shape-rendering=\"crispEdges\"" 'FNR==1 && f{ 
                ####print "f= "f,"filename= " FILENAME 
                close(temp_file); 
                close(f); 
                system("mv "temp_file FS f); 
                f="" 
                } 
             /ns0:svg xmlns:ns0=\"w3.org\/2000\/svg\"/ 
             { 
              sub(/>$/,FS s1 ">") 
             } 
             {if(!f) 
             { 
              f=FILENAME 
             }} 
             { 
              print > temp_file; 
             } 
             ' *.svg 
+0

如何使用svg文件爲整個文件夾執行此操作?對不起,我還沒有使用這些工具,我不知道你是否可以迭代文件。 – TheRevanchist

+0

我可以編輯我的文章,如果你想這樣做的特定文件,我的問題是你想要保存更改到Input_file本身?請讓我知道。 – RavinderSingh13

+0

是的,我希望將更改保存在輸入文件中。所以,在流程結束時,應該有相同的文件,但每個文件都應該有這個額外的屬性。 – TheRevanchist

0

(發佈代表OP)的

感謝A. Haaji的回覆,問題解決了。我只需遍歷一個文件列表,然後使用他們的代碼,一切正常。最終的解決方案是:

for i in *.svg 
do 
    sed -i 's/<ns0:svg\(.*\)>/<ns0:svg\1 shape-rendering="crispEdges" >/g' "$i" 
done 
相關問題