1
$ 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

4 回答 4

0

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

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

sed 's/\".*\"/hello/'
于 2012-10-22T02:43:18.697 回答
0

除了包含在“”中的那些之外,我没有看到直接替换所有其他的方法

但是,使用递归 sed,一种蛮力方法,您可以实现它。

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

于 2012-10-22T02:51:59.090 回答
0
sed 's/[^\"]rome[^\"]/hello/g' your_file

测试如下:

> cat temp
    "rome" newyork
    "rome"
    rome 

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

> 
于 2012-10-22T07:45:12.227 回答
0

第二个问题可以用一个简单的 perl one-liner 来解决(假设每行只有一个 hello):

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;
}
于 2012-10-22T09:00:47.787 回答