【问题标题】:how to replace a specific char in a file如何替换文件中的特定字符
【发布时间】:2021-08-23 10:19:49
【问题描述】:

我想替换文件中的特定字符。例如,我有一个 20 行的文件,我想替换第 5 行第 12 列的字母 a。 例子: 我在第 5 行有什么 hello world! 我想用?替换!

这不能通过搜索和替换方法来完成,因为文件中的实际文本或多或少是随机的或经常更改。我需要在第 5 行第 12 列指定未知字符,然后替换

【问题讨论】:

    标签: bash awk sed scripting


    【解决方案1】:

    编辑 - 比我更好的答案:

    来自@Cyrus:

    sed -E '5 s/(.{11})./\1?/' your_file
    

    来自@potong:

    sed '5s/./?/12' your_file
    

    我的原始答案(只是为了与更清洁的方法进行对比)

    这样就可以了:

    sed '5 s/\(.\{11\}\).\(.*\)/\1?\2/' your_file
    

    它的工作方式如下:

    • 在第 5 行,执行替换
    • 我记得上面使用\(\)之间的东西
    • 第一个记住的部分匹配任何类型的 11 个字符.\{11\}
    • 然后匹配任何类型的单个字符(在您的情况下将是 '!')
    • 第二个记住的部分匹配单个字符\{.*\}之后的所有内容
    • 然后我们把记住的内容放回去\1\2
    • 但是我们用问号替换单个匹配字符

    一旦您确认它可以满足您的需求,您可以添加 -i 来执行 就地替换:

    sed -i '5 s/\(.\{11\}\).\(.*\)/\1?\2/' your_file
    

    如果我们使用扩展表达式标志 (-E),我们不必逃避太多 东西:

    sed -E '5 s/(.{11}).(.*)/\1?\2/' your_file
    

    【讨论】:

    • 我觉得你可以稍微精简一下:sed -E '5 s/(.{11})./\1?/' your_file
    • 或许sed '5s/./?/12' file?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2021-01-02
    • 2021-02-14
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多