首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed -与插入行开头的双制表符匹配后插入行。

sed -与插入行开头的双制表符匹配后插入行。
EN

Stack Overflow用户
提问于 2017-06-14 23:21:11
回答 2查看 1.5K关注 0票数 1

我有以下input.txt:

代码语言:javascript
复制
        "loop:\n\t" 
        "add %%g1, 1, %%g1\n\t" 

我想在第一行和第二行之间插入一行,以便得到:

代码语言:javascript
复制
    "loop:\n\t" 
    "add %%g1, 1, %%g1\n\t" 
    "add %%g1, 1, %%g1\n\t" 

在这里,我尝试过:

代码语言:javascript
复制
sed '/loop\:/a "\t \t add %%g1, 1, %%g1\\n\\t"' input.txt

但有了这个,我得到了:

代码语言:javascript
复制
        "loop:\n\t" 
"       add %%g1, 1, %%g1\n\t" 
        "add %%g1, 1, %%g1\n\t" 

正如你所看到的,插入行的第一个引号是在行的开头,而不是在add单词之前。

如何规避这一问题?

谢谢

更新1 :

我意识到,从每一行开始到第一个字符之间的空格不是表格,而是经典的空格。

然后,我尝试使用这个解决方案(来自this link)

代码语言:javascript
复制
awk '{print} /loop\:/{ print substr($0,1,match($0,/[^[:space:]]/)-1) "add %%g1, 1, %%g1\n\t"}' input.txt

这个命令行似乎计算了前一行的正确缩进,但不幸的是,我理解如下:

代码语言:javascript
复制
           "loop:\n\t" 
"add %%g1, 1, %%g1\n\t" 
           "add %%g1, 1, %%g1\n\t" 

鉴于我希望:

代码语言:javascript
复制
           "loop:\n\t" 
           "add %%g1, 1, %%g1\n\t" 
           "add %%g1, 1, %%g1\n\t" 

你能看到错误吗?

问候

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-14 23:29:09

sed是用于单个行上的简单替换,仅此而已。对于任何稍微有趣的东西,只需使用awk来获得清晰、可移植性、效率和软件的其他最理想的属性:

代码语言:javascript
复制
$ awk '{print} /loop:/{print "\t\"add %%g1, 1, %%g1\\n\\t\""}' file
        "loop:\n\t"
        "add %%g1, 1, %%g1\n\t"
        "add %%g1, 1, %%g1\n\t"

上面的这些只是实现了您试图使用sed所做的事情,但是可能有更好的方法,取决于您的实际需求,例如,其中任何一个都比上面的任何一个都有好处,但是在不同的条件下产生相同的输出:

代码语言:javascript
复制
$ awk '1;NR==2' file
        "loop:\n\t"
        "add %%g1, 1, %%g1\n\t"
        "add %%g1, 1, %%g1\n\t"


$ awk '{print} f{print;f=0} /loop:/{f=1}' file
        "loop:\n\t"
        "add %%g1, 1, %%g1\n\t"
        "add %%g1, 1, %%g1\n\t"

$ awk '{print} /loop:/{sub(/".*/,""); print $0 "\"add %%g1, 1, %%g1\\n\\t\""}' file
        "loop:\n\t"
        "add %%g1, 1, %%g1\n\t"
        "add %%g1, 1, %%g1\n\t"

基于您在a previous answer of mine下留下的注释,听起来您确实想要其中的一个底部,所以您不必指定缩进。

票数 2
EN

Stack Overflow用户

发布于 2017-06-14 23:29:32

与GNU sed:

用反斜杠转义第一个\t

代码语言:javascript
复制
sed '/loop\:/a \\t "add %%g1, 1, %%g1\\n\\t"' file

或搜索和替换:

代码语言:javascript
复制
sed 's/loop\:.*/&\n\t "add %%g1, 1, %%g1\\n\\t"/' file
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44556152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档