Unix:在文本中的符号后添加唯一名称

Unix:在文本中的符号后添加唯一名称

我有一个如下所示的文件:

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 中,正则表达式由正斜杠分隔;要将斜杠放入正则表达式中,您需要使用反斜杠对其进行转义。RegEx///\

在 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

相关内容