2012-01-19 55 views
0

我在解析文件名中的字符時遇到了麻煩。如何去除文件名中的字符?

例如:

1326847080_MUNDO-Cinco-Cosas-Que-Aprendimos-Del-Debate-De-Los-Republicanos-1.xml 

1326836220_PLANETACNN-Una-Granja-De-Mariposas-Ayuda-A-Reducir-La-Tala-De-Bosques-En-Tanzania-3.xml 

這是我想的輸出:

1326847080_MUNDO-1.xml 

1326836220_PLANETACNN-3.xml 

回答

0
for i in *.xml 
do 
    j=$(echo $i | sed -e s/-.*-/-/) 
    echo mv $i $j 
done 

或在一行:

for i in *.xml; do echo mv $i $(echo $i | sed -e s/-.*-/-/); done 

除去echo實際執行mv COMM和。

,或在不sed,使用bash內置的模式替換:

for i in *.xml; do echo mv $i ${i//-*-/-}; done 
0

rename救援,用Perl的正則表達式。該命令將顯示將執行哪些動作;只是刪除-n實際重命名文件:

$ rename -n 's/([^-]+)-.*-([^-]+)/$1-$2/' *.xml 
1326836220_PLANETACNN-Una-Granja-De-Mariposas-Ayuda-A-Reducir-La-Tala-De-Bosques-En-Tanzania-3.xml renamed as 1326836220_PLANETACNN-3.xml 
1326847080_MUNDO-Cinco-Cosas-Que-Aprendimos-Del-Debate-De-Los-Republicanos-1.xml renamed as 1326847080_MUNDO-1.xml 

正則表達式解釋說:

  • 保存部分達(但不包括)第一個破折號比賽1
  • 保存零件後最後短劃線作爲匹配2.
  • 更換部分從匹配1開始到比賽2與第1場,破折號結束時,和匹配2.
0

對於遲到的回覆感到抱歉,但我今天看到:(。 我認爲你正在尋找下

輸入文件:: 貓> ABC

1326847080_MUNDO-Cinco-Cosas-Que-Aprendimos-Del-Debate-De-Los-Republicanos-1.xml 
1326836220_PLANETACNN-Una-Granja-De-Mariposas-Ayuda-A-Reducir-La-Tala-De-Bosques-En-Tanzania-3.xml 

代碼:(它有點太簡單了,即使我喜歡)

while read line 
    do 
    echo $line ; 
    fname=`echo $line | cut -d"-" -f1`; 
    lfield=`echo $line | sed -n 's/\-/ /gp' | wc -w`; 
    lname=`echo $line | cut -d"-" -f${lfield}`; 
    new_name="${fname}-${lname}"; 
    echo "new name is :: $new_name"; 
    done < abc ; 

輸出::

1326847080_MUNDO-Cinco-Cosas-Que-Aprendimos-Del-Debate-De-Los-Republicanos-1.xml 
new name is :: 1326847080_MUNDO-1.xml 

1326836220_PLANETACNN-Una-Granja-De-Mariposas-Ayuda-A-Reducir-La-Tala-De-Bosques-En-Tanzania-3.xml 
new name is :: 1326836220_PLANETACNN-3.xml 
相關問題