Adicionar ;; na parte superior e inferior de cada arquivo em uma lista [duplicada]

0

Eu tenho uma lista dos locais de cada arquivo de texto que precisam ser feitos dentro de add.txt

Por exemplo, dentro de add.txt , tenho o seguinte

/root/QuestDiary/MapQuest_Def/Mon_Umyounkijang.txt
/root/Market_Def/06Inn_SamakwAr-5.txt

Eu preciso de um script para abrir todos os arquivos de texto nessa lista e adicionar; na parte superior e inferior de cada um deles. Ele também deve abrir arquivos / pastas com maiúsculas, listado como /root/Market_Def/06Inn_SamakwAr-5.txt no arquivo, mas o nome real do arquivo é /root/Market_DEF/06Inn_SamakWar-5.txt

06Inn_SamakWar-5.txt atualmente parece com

%100
+40
+1

[@main]
#IF
checkpkpoint 2

#SAY
#INCLUDE [..\Convert_Def\Market_DefMeet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_0


#ELSESAY
#INCLUDE [..\Convert_Def\Market_DefMeet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_1

[@buy]

#SAY
#INCLUDE [..\Convert_Def\Market_DefMeet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_2

[@sell]

#SAY
#INCLUDE [..\Convert_Def\Market_DefMeet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_3

[Goods]

Jerk 1000 1

[@TalkToQuest]
#CALL [NPCQuest_DefWeapon_BichonSung-10.txt] @NPCQuest_Check

[@everythingreward]
#CALL [System\TotalRewardSystem.txt] @TotalRewardSystem

Deve mudar para

;;
%100
+40
+1

[@main]
#IF
checkpkpoint 2

#SAY
#INCLUDE [..\Convert_Def\Market_DefMeet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_0


#ELSESAY
#INCLUDE [..\Convert_Def\Market_DefMeet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_1

[@buy]

#SAY
#INCLUDE [..\Convert_Def\Market_DefMeet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_2

[@sell]

#SAY
#INCLUDE [..\Convert_Def\Market_DefMeet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_3

[Goods]

Jerk 1000 1

[@TalkToQuest]
#CALL [NPCQuest_DefWeapon_BichonSung-10.txt] @NPCQuest_Check

[@everythingreward]
#CALL [System\TotalRewardSystem.txt] @TotalRewardSystem

;;
    
por Rarara221 14.10.2016 / 21:04

2 respostas

2

Com o GNU sed :

sed -e '1i ;;' -e '$a ;;'

É composto por duas expressões sed :

  • 1i ;; insere ( i ) ;; (nova linha incorporada) antes da primeira linha ( 1 )

  • $a ;; appends ( a ) ;; (nova linha incorporada) após a última linha ( $ )

Exemplo:

$ cat foo.txt
sdas
adas

$ sed -e '1i ;;' -e '$a ;;' foo.txt 
;;
sdas
adas
;;

Como você tem todos os arquivos em add.txt , assumindo que nenhum nome de arquivo contenha nenhum caractere de IFS (espaço, tabulação, nova linha por padrão) nem caracteres curinga ( * , ? , [] ), Você pode fazer o seguinte para editar os arquivos em vigor com uma extensão .bak como backup do original:

sed -i.bak -e '1i ;;' -e '$a ;;' -- $(cat add.txt)

Sem um backup:

sed -i -e '1i ;;' -e '$a ;;' $(cat add.txt)

Quando -i é usado, os arquivos são tomados separadamente, em vez de um único fluxo, então estamos prontos. Sem -i , precisamos usar a opção -s para obter fluxos separados para arquivos.

Ou leia os nomes dos arquivos, separados por nova linha e faça a operação um por um, com backup:

while IFS= read -r f; do sed -i.bak -e '1i ;;' -e '$a ;;' -- "$f"; done <add.txt

sem backup:

while IFS= read -r f; do sed -i -e '1i ;;' -e '$a ;;' -- "$f"; done <add.txt
    
por 14.10.2016 / 21:12
0

com cat :

cat <( echo ";;" ) /path/to/inputfile <( echo ";;" )

Se você tem uma lista de arquivos, você pode usar:

while read file; do
   scratchfile=$(mktemp)
   cat <( echo ";;" ) "$file" <( echo ";;" ) > $scratchfile
   mv -f "$scratchfile" "$file"
done < /path/to/file.list

Se você tiver um comando (por exemplo, find ) fornecendo a lista, poderá usar:

IFS="\n"
for file in $( /some/command ); do
   scratchfile=$(mktemp)
   cat <( echo ";;" ) "$file" <( echo ";;" ) > $scratchfile
   mv -f "$scratchfile" "$file"
done
    
por 14.10.2016 / 22:12