添加 ;;到列表中每个文件的顶部和底部

添加 ;;到列表中每个文件的顶部和底部

我有一个需要在内部完成此操作的每个文本文件的位置列表add.txt

例如里面add.txt我有以下内容

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

我需要一个脚本来打开该列表中的每个文本文件并添加 ;;到每个的顶部和底部。它还必须打开具有大写字母的文件/文件夹,它/root/Market_Def/06Inn_SamakwAr-5.txt在文件中列出,但实际文件名是/root/Market_DEF/06Inn_SamakWar-5.txt

06Inn_SamakWar-5.txt目前看起来像

%100
+40
+1

[@main]
#IF
checkpkpoint 2

#SAY
#INCLUDE [..\Convert_Def\Market_Def\01Meet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_0


#ELSESAY
#INCLUDE [..\Convert_Def\Market_Def\01Meet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_1

[@buy]

#SAY
#INCLUDE [..\Convert_Def\Market_Def\01Meet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_2

[@sell]

#SAY
#INCLUDE [..\Convert_Def\Market_Def\01Meet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_3

[Goods]

Jerk 1000 1

[@TalkToQuest]
#CALL [NPCQuest_Def\02Weapon_BichonSung-10.txt] @NPCQuest_Check

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

它应该更改为

;;
%100
+40
+1

[@main]
#IF
checkpkpoint 2

#SAY
#INCLUDE [..\Convert_Def\Market_Def\01Meet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_0


#ELSESAY
#INCLUDE [..\Convert_Def\Market_Def\01Meet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_1

[@buy]

#SAY
#INCLUDE [..\Convert_Def\Market_Def\01Meet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_2

[@sell]

#SAY
#INCLUDE [..\Convert_Def\Market_Def\01Meet_BichonSung-10.txt] @Convert_01Meet_BichonSung-10_3

[Goods]

Jerk 1000 1

[@TalkToQuest]
#CALL [NPCQuest_Def\02Weapon_BichonSung-10.txt] @NPCQuest_Check

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

;;

答案1

使用 GNU sed

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

它由两个表达式组成sed

  • 1i ;;在第一行 ( )之前插入 ( i) (嵌入换行符);;1

  • $a ;;在最后一行 ( )之后追加 ( a) (嵌入换行符);;$

例子:

$ cat foo.txt
sdas
adas

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

由于您拥有 中的所有文件add.txt,假设文件名不包含任何字符IFS(默认情况下为空格、制表符、换行符)或通配符(*?[]),您可以执行以下操作来编辑文件,并将.bak扩展名作为文件的备份原来的:

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

没有备份:

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

-i使用时,文件是单独获取的,而不是单个流,所以我们可以开始了。如果没有-i,我们需要使用该-s选项来获取文件的单独流。

或者读取文件名,以换行符分隔,并一一进行操作,并进行备份:

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

没有备份:

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

答案2

cat

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

如果您有文件列表,则可以使用:

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

find如果您有提供列表的命令(例如),您可以使用:

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

相关内容