我有一个如下所示的文件:
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst
我使用以下代码将 // 行插入到文档的开头(按照此处的建议:将文本添加到文本文件的开头),并将此更新保存到新文件中。
sed '1s/^/\/\/\'$'\n/' File_1.txt > File_2.txt
然而,我想做的是在每个 // 之后添加唯一的名称,得到如下结果:
// Text 1
abcdefghijklmnopqrst
// Text 2
abcdefghijklmnopqrst
// Text 3
abcdefghijklmnopqrst
ETC。
我想我可以使用 tr 来翻译例如。将“//”转换为“//文本1”。但是如何将文本 2 添加到下一个 //,文本 3 添加到第三个 // 等等? txt 文件是 mac-osx 制作的。
更新:
你的解决方案看起来不错,@PM 2Ring,但是,我还有一个额外的问题,该文件实际上如下所示:
//
abcdefghijklmnopqrstu
// x x
abcdefghijklmnopqrstu
// x x
abcdefghijklmnopqrstu
因此,名称完美地插入到第一行,但在 / 的秒对之后,名称插入到行尾的 x 之后。我需要在//之后插入名称,但不将剩余的文本向右移动。是否可以删除与名称中的字符相同数量的空格?当然,这不应该在第一行中完成,因为我认为这会删除第二行中的字符。
答案1
您可以通过以下方式轻松做到这一点awk
:
awk 'BEGIN{n=1}; /\/\//{$0=$0 " Text " n; n+=1}; {print}' infile
如果infile
包含
//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst
上面的命令打印
// Text 1
abcdefghijklmnopqrst
// Text 2
abcdefghijklmnopqrst
// Text 3
abcdefghijklmnopqrst
看起来很神秘的是/\/\//
一个包含.在 awk 中,正则表达式由正斜杠分隔;要将斜杠放入正则表达式中,您需要使用反斜杠对其进行转义。Reg
Ex
//
/
\
在 awk 中,图案{行动} 表示执行行动如果当前行匹配图案。该BEGIN
模式是一种特殊的模式,表示我们希望在读取任何行之前发生的操作。如果我们不指定模式,则会对所有行执行该操作(尽管有一种方法可以覆盖它)。
此更新版本将在您的新输入文件上起作用,但不幸的是它不会保留间距
awk 'BEGIN{n=1}; /^\/\//{$1=$1 " Text " n; n+=1}; {print}' infile
输入
// x x
abcdefghijklmnopqrst
// x x
abcdefghijklmnopqrst
// x x
abcdefghijklmnopqrst
输出
// Text 1 x x
abcdefghijklmnopqrst
// Text 2 x x
abcdefghijklmnopqrst
// Text 3 x x
abcdefghijklmnopqrst
答案2
您可以使用perl
, 和评估标志来增加替换部分中的变量。它搜索以数字开头//
并附加Text
后跟数字的每一行:
perl -pe 's{\A(//)}{$1 . " Text " . ++$i}e' File_1.txt
它产生:
// Text 1
abcdefghijklmnopqrst
// Text 2
abcdefghijklmnopqrst
// Text 3
abcdefghijklmnopqrst
更新(看评论):
对后面的空格进行分组//
并计算要在替换部分中插入的空格数,例如:
perl -pe 's{\A(//)(\h*)}{$1 . " Text " . ++$i . " " x ((length ($2)) - length(" Text " . $i))}e' temp
使用你的最后一个例子,它会产生:
// Text 1
abcdefghijklmnopqrstu
// Text 2 x x
abcdefghijklmnopqrstu
// Text 3 x x
abcdefghijklmnopqrstu
答案3
将@Birei 解决方案转换为“额外麻烦”更新:
perl -pe 's{^// {10}}{sprintf("// Text %-3d ",++$i)}e or
s{^// }{sprintf("// Text %d", ++$i)}ex ' infile