【问题标题】:Insert character after first match using sed or awk使用 sed 或 awk 在第一次匹配后插入字符
【发布时间】:2015-12-02 23:20:41
【问题描述】:

我有一个 txt 文件包含一个带有文本描述的计数:

12 CASH
10 Tree
7 Computer Desk

理想情况下我想结束

| CASH | 12 |
| Tree | 10 |
| Computer Desk | 7 |

我在下面尝试了这个 awk 语句,哪种方法有效,但是在描述的第一个字之后我失去了任何东西。我觉得我应该使用 sed,但我正在努力想出一个可行的解决方案。

awk '{ print "|" $2 "|" $1 "|" }' temp.txt

结果:

| CASH | 12 |
| Tree | 10 |
| Computer | 7 |

【问题讨论】:

  • 什么是列分隔符?否则“计算机”和“办公桌”可能看起来像不同的列。
  • perl 很适合这个:perl -lane '$v = shift @F; print "| @F | $v |"' temp.txt

标签: regex bash awk sed


【解决方案1】:

用 GNU sed 试试这个:

sed -E 's/([0-9]+)[[:blank:]]+(.*)/| \2 | \1 |/' file

-E(未记录)或-r:启用extended regular expressions

[0-9]+:匹配一个或多个数字(范围 0 到 9)

[[:blank:]]Posix character class,代表空格或制表符

【讨论】:

  • 我建议[[:blank:]] 而不是[\t ]
  • @glennjackman:是的!谢谢你的提示。我已经更新了我的答案。
  • 我也是这样做的,但是被\d屏蔽了,可以用[[:digit:]]写。
  • 这行得通,但你介意解释一下吗?我得到 sed 正在搜索一个零个或多个数字的数字,但是在\t* 之后我迷路了
  • @Rob,正则表达式找到一些数字(保存在第一个捕获组中)、一些空格,然后任何其他文本(描述)保存在第二个捕获组中。根据要求,替换将描述放在数字之前。
【解决方案2】:

是的,使用 sed 很容易:

sed 's/\([^ ]*\) \(.*\)/| \2 | \1 |/'

第一个空格之前的非空格转到\1,该行的其余部分转到\2

| CASH | 12 |
| Tree | 10 |
| Computer Desk | 7 |

【讨论】:

  • 我试过了,结果如下:|12 CASH | |等等。
  • 输入中的标签,也许?
【解决方案3】:

Posix 版本

sed 's/\([^[blank:]]\{1,}\)[[:blank:]]\{1,\}([^[blank:]].\{1,}\)/| \2 | \1 |/' YourFile

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2012-04-15
    • 2015-06-08
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多