linux - 如何使用命令 `sed` 请求确认
问题描述
我正在尝试使用以下命令替换多个文件的字符串sed
:
grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'
我的问题是:有没有办法让它在每次替换时都要求确认?
我试图在替换命令中包含后者c
,g
但没有成功。
提前感谢您的任何评论。
解决方案
该sed
实用程序没有确认功能。如果/直到实现,请考虑使用其他工具。
'ex'(命令行模式下的 vim)具有强大的功能,包括每次更改确认。确认模式面向视觉使用。一个问题是,一旦单个更改未获批准,替换就会停止。从表面上看,这不是所要求的。
潜在的解决方案是使用能够替换的脚本引擎,并实现确认逻辑。Awk
, Perl
,python
满足这些要求。
Perl 有就地编辑选项。可以使用“perl -i.bak”调用脚本。
安全性:通知代码可能需要额外的保护以防止注入 RE。见下文
启用:
grep -rl 匹配字符串 somedir/ | xargs perl -i.bak sub-conf.pl 'string1' 'string2'
#! /usr/bin/perl
use strict ;
my ($in_pattern, $replacement) = (shift, shift) ;
# Convert string to regexp, disable special characters, etc.
my $pattern = quotemeta($in_pattern) ;
open TTY, "/dev/tty" or die "Failed to open TTY: $!" ;
# Read a line into orig
my $eof ;
while ( my $orig = <> ) {
my $new = $orig =~ s/$pattern/$replacement/gr ;
if ( $new ne $orig ) {
print STDERR "Replace line ${.}:\n< ${orig}> $new" ;
while (1) {
print STDERR "(Y/N) ?" ;
my $yn = <TTY> ;
unless ( defined($yn) ) { $eof = 1 ; last } ;
if ( $yn =~ /[Yy]/ ) { print $new ; last ; } ;
if ( $yn =~ /[Nn]/ ) { print $orig ; last ; } ;
} ;
} else {
print $orig ;
} ;
die 'EOF' if $eof ;
} ;
请参阅:如何在 Perl 中安全地验证不受信任的正则表达式?在需要扩展命令以接受 REGEX 时解释注入保护。
推荐阅读
- css - CSS - 添加省略号而没有文本溢出
- laravel - Laravel 索引和存储视图在同一页面方法中
- java - 输入的行为不像预期的那样,java FileReader
- java - 如果存在则如何返回对象,否则返回可选的空
- php - 如何为单个类别插入单个图像,同时排除一些?
- python - NotImplementedError:预训练图形输出 -> 新层
- ios - Swift UISearchController tableview 搜索结果滚动不会在键盘上方移动到最后一行
- ionic-framework - Access-Control-Allow-Origin 不允许 Ionic 4 Origin ionic://localhost
- php - 根据表单提交显示门控和非门控内容
- api - Splash Payrix 商家 ID 和门户凭证