我有一个需要在内部完成此操作的每个文本文件的位置列表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