【问题标题】:How to replace text in a specific line between first appearence of a symbol and second appearence of it如何在符号第一次出现和第二次出现之间替换特定行中的文本
【发布时间】:2020-10-14 06:12:21
【问题描述】:

所以,假设我有一些这样的文本文件:

aaaa:bbbb:cccc:dddd
eeee:ffff:gggg:hhhh
iiii:jjjj:kkkk:llll

我需要一个命令来替换变量行中第一个和第二个: 之间的内容。 我设法做这样的事情,但显然只是在中间添加文本: sed $lineNumber' s/:/:'$pass'/' users.txt

如果我想用“asd”替换第二行的第一个和第二个“:”之间的内容,命令给出的结果应该是这样的

aaaa:bbbb:cccc:dddd
eeee:asd:gggg:hhhh
iiii:jjjj:kkkk:llll

【问题讨论】:

  • 你总是知道确切的行号,还是XY Problem

标签: bash shell


【解决方案1】:

awk的工作:

awk -v col="2" -v row="2" -v sep=":" -v new="asd" 'BEGIN{FS=OFS=sep} NR==row{$col=new} {print}' file

awk 'NR==row{$col=new}1' col='2' row='2' FS=':' OFS=':' new='asd' file

输出:

aaaa:bbbb:cccc:dddd eeee:asd:gggg:hhhh iii:jjjj:kkkk:llll

见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

【讨论】:

    【解决方案2】:

    使用与您要替换的整个部分匹配的正则表达式,例如,

    sed "$lineNumber s/:[^:]\+/:$pass/" users.txt
    #                   ^^^^^^ = not : one or more times
    

    【讨论】:

    • 你和Abelisto差不多在同一时间发帖,所以我给你同样的评论:我喜欢sed,但在这里很难。试试pass="&/\2"
    • Cyrus 的回答对此更好,因为它处理了不可避免的有趣字符。
    【解决方案3】:

    如果你想扩展 shell 变量,在 sed 命令中使用双引号:

    sed "$var1 s/:/:$var2/" file
    

    【讨论】:

    • var2="&/\2" 怎么样?
    猜你喜欢
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2016-03-20
    • 1970-01-01
    • 2021-09-24
    • 2020-07-10
    相关资源
    最近更新 更多