如何用多行搜索和替换多行
我查看了有关搜索和替换的其他答案,但我无法理解这些模式。如何用多行搜索和替换多行
我怎样才能更改文件的这一部分(行号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的&击):
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中的降价格式不正确,但大多数shell应该。
回答:
sed
可能是这种情况的最佳工具,
假设您的替换文本是在文件replace.txt
$ sed '153,156{153{r replace.txt }; d}' file
可能只工作了GNU sed
回答:
如果您对于@ karafka的回答没有GNU-sed,只想在确切的行号处更改行,您也可以使用ed
。
ed -s file <<'EOF' 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
}
.
w
q
EOF
回答:
这是Tie::File
module的应用程序,它映射数组到一个文本文件中的线,所以您对数组的任何更改将在磁盘文件中反映出来一个很好的案例。这是一个核心模块,所以你不需要安装它。
这里,tie
调用数组@file
映射到你的文本文件,并 splice
用从DATA
阅读更换内容的四行文字。 然后untie
更新并关闭文件。
请注意,您必须将myfile.txt
更改为输入文件的真实路径。
use strict; use warnings 'all';
use Tie::File;
tie my @file, 'Tie::File', 'myfile.txt' or die $!;
splice @file, 152, 4, <DATA>;
untie @file;
__DATA__
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
}
回答:
一个Perl的一行,以改变线153..156
在file
与repl.file
内容,就地
perl -i -wpe' if (153..155) { s/.*\n// }
elsif ($.==156) { local $/; open $fh, "repl.file"; $_ = <$fh> };
' file
(或者$_ = path($file_name)->slurp
与Path::Tiny。)
这直接转换成一个脚本,可以通过写入一个包含更改的新文件并将其移至原始文件(请参阅in perlfaq5和SO帖子),或者在脚本中将其移至using -i
($^I
)。
以上是 如何用多行搜索和替换多行 的全部内容, 来源链接: utcz.com/qa/258125.html