2014-04-24 53 views
1

我有一个txt文档,它是一个项目列表。每一行都是不同的名称/标题。但对于这个例子,我会坚持一个名字。使用unix命令重命名文档中的行(Bash)

例如:

font0.tff 
font1.tff 
font2.tff 
font3.tff 
font4.tff 

我想以编程方式更改文件下面,放置<item></item>标签之间的每一行:

<item>font0.ttf</item> 
<item>font1.ttf</item> 
<item>font2.ttf</item> 
<item>font3.ttf</item> 
<item>font4.ttf</item> 
+0

似乎是一个微不足道的'sed的'命令。你有什么问题? – Barmar

+0

你真的意味着他们都应该成为'font.1',不保留原始字体号吗? – Barmar

+0

不,他们不应该。这些文件有很多名字。它需要采用该名称并将其放置在该标签之间。我不想改变原来的名字。 –

回答

5

使用sed

sed 's#font\.\(.*\)#font\1.ttf -> <item>font.1</item>#' infile > outfile 
+0

感谢您的快速响应。我不熟悉sed。但我知道这会起作用。如果我想忽略文件名和扩展名,我怎么修改你的代码呢? –

+0

如果你希望做任何shell脚本,你应该熟悉sed。我不知道你的意思是不考虑文件名和扩展名。你能否更新问题中的例子来展示你的意思? – Barmar

+0

我更新了描述,希望能够更清楚一点。 –

4

您可以使用sed中的&字符考虑匹配的模式。我使用@来界定正则表达式,所以我没有逃跑的/在</item>

sed '[email protected]*@& -> <item>&</item>@' input.txt 
+0

@Randolphg如果你只是想重命名的项目,使用'sed's @。* @ @'input.txt' – pcantalupo

+0

似乎没有改变文件中的文本。终端显示正在发生某些事情,但是当我打开该文件时,其中的文本仍然是相同的。 –

+0

@Randolphg如果你想改变文件,然后使用sed的'-i'选项,比如'sed -i .....'。只有在确认命令正确后才能执行此操作 – user000001

4

使用sed

$ sed 's#.*#<item>&</item>#g' test.txt 
<item>font0.tff</item> 
<item>font1.tff</item> 
<item>font2.tff</item> 
<item>font3.tff</item> 
<item>font4.tff</item> 

这是简写形式,

$ sed 's#\(.*\)#<item>\1</item>#g' test.txt 

或者,使用awk

$ awk '$0="<item>"$0"</item>"' test.txt 
<item>font0.tff</item> 
<item>font1.tff</item> 
<item>font2.tff</item> 
<item>font3.tff</item> 
<item>font4.tff</item> 
1

也许awk是更简单/更快的方法。

如果您不需要更改扩展名

awk '{print "<item>"$0"</item>"}' Test.txt > NewFile.txt 

如果您需要从.tff扩展更改为.ttf下面一行很容易记住

awk '{print "<item>"$0"</item>"}' Test.txt | sed s/".tff"/".ttf"/g > NewFile.txt