将all替换为“hello”,但双引号之间的字符串除外

时间:2012-10-22 02:32:12

标签: regex shell sed

$ cat file1
"rome" newyork
"rome"
rome 

我需要填写空白?

$ sed ____________________ file1

我想输出

"rome" newyork
"rome"
hello

如果我的输入是这样的

$ cat file1
/temp/hello/ram  
hello   
/hello/temp/ram

如果我想更改没有斜线的hello我该怎么办? (改变你好,快乐)

temp/hello/ram 
happy  
/hello/temp/ram

4 个答案:

答案 0 :(得分:0)

为什么rome更改为hellonewyork不是?如果我正确地阅读了这个问题,那么您是否尝试使用hello替换不是双引号的所有内容?

根据您想要的确切用例(输入字符串""会发生什么?),您可能想要这样的内容:

sed 's/\".*\"/hello/'

答案 1 :(得分:0)

除了“

”中的内容之外,我没有看到替换所有其他内容的直接方法

然而,使用递归sed,一种蛮力方法,你可以实现它。

cat file1 | sed "s/\"rome\"/\"italy\"/g" | sed "s/rome/hello/g" | sed "s/\"italy\"/\"rome\"/g"

答案 2 :(得分:0)

sed 's/[^\"]rome[^\"]/hello/g' your_file

测试如下:

> cat temp
    "rome" newyork
    "rome"
    rome 

> sed 's/[^\"]rome[^\"]/hello/g' temp
    "rome" newyork
    "rome"
   hello

> 

答案 3 :(得分:0)

第二个问题可以通过一个简单的perl单行解决(假设每行只有一个问号):

perl -pe 'next if /\//; s/hello/happy/;'

第一个问题需要一些内部簿记来跟踪你是否在一个字符串内。这也可以用perl来解决:

#!/usr/bin/perl -w
use strict;
use warnings;

my $state_outside_string = 0;
my $state_inside_string  = 1;

my $state = $state_outside_string;

while (my $line = <>) {
    my @chars = split(//,$line);
    my $not_yet_printed = "";
    foreach my $char (@chars) {
        if ($char eq '"') {
            if ($state == $state_outside_string) {
                $state = $state_inside_string;
                $not_yet_printed =~ s/rome/hello/;
                print $not_yet_printed;
                $not_yet_printed = "";
            } else {
                $state = $state_outside_string;
            }
            print $char;
            next;
        }
        if ($state == $state_inside_string) {
            print $char;
        } else {
            $not_yet_printed .= $char;
        }
    }
    $not_yet_printed =~ s/rome/hello/;
    print $not_yet_printed;
}