首页 > 解决方案 > 如何使用命令 `sed` 请求确认

问题描述

我正在尝试使用以下命令替换多个文件的字符串sed

grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'

我的问题是:有没有办法让它在每次替换时都要求确认

我试图在替换命令中包含后者cg但没有成功。

提前感谢您的任何评论。

标签: linuxsed

解决方案


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 时解释注入保护。


推荐阅读