bash - 如何用多行搜索和替换多行

标签 bash perl awk sed grep

我查看了有关搜索和替换的其他答案,但我就是无法理解其中的模式。

如何更改文件的这一部分(行号 153 ... 156)

        let view = string.utf8
        offset.pointee += string.substring(to: range.lowerBound).utf8.count
        length.pointee = Int32(view.distance(from:range.lowerBound.samePosition(in: view), to:range.upperBound.samePosition(in: view)))
        return token

并将其替换为下面的行?

        let view:String.UTF8View = string.utf8

        if let from = range.lowerBound.samePosition(in: view),
           let to = range.upperBound.samePosition(in: view) {
            offset.pointee += Int32(string[string.startIndex..<range.lowerBound].utf8.count)
            length.pointee = Int32(view.distance(from: from, to: to))
            return token
        } else {
            return nil
        }

最佳答案

这可能对你有用(GNU sed 和 Bash):

sed $'153r replacementFile\n;153,156d' file

或者对于大多数 seds:

sed -e '153r replacementFile' -e '153,156d' file

或者如果您愿意:

sed '153,156c\        let view:String.UTF8View = string.utf8\
    if let from = range.lowerBound.samePosition(in: view),\
       let to = range.upperBound.samePosition(in: view) {\
        offset.pointee += Int32(string[string.startIndex..<range.lowerBound].utf8.count)\
        length.pointee = Int32(view.distance(from: from, to: to))\
        return token\
    } else {\
        return nil\
    }' file

注意第一个 \ 保留前导空格,除最后一行之外的每一行都需要附加 \。当空行由单个 \ 表示时,SO 中的 Markdown 格式不正确(因此我删除了替换的第二行),但大多数 shell 应该。

关于bash - 如何用多行搜索和替换多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47612102/

相关文章:

time - AWK 命令将纪元时间更改为日期并在同一行上列出纪元

python - 使用 popen 和专用的 TTY Python 运行交互式 Bash

linux - 需要将 getopts 与一个参数或另一个参数一起使用

java - Perl 和 Java 中的 Unicode 比较

excel - 无法在未定义的值上调用方法 Worksheet

regex - Perl 中的否定回顾断言

regex - Awk:如何处理文件夹和子文件夹中的多个 files.txt?

linux - 命令在终端而不是脚本中工作

bash - 当我使用 'sh' 运行 Bash 代码时,为什么它会失败?

windows - awk 的 gsub 问题 (gawk)