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変更されますhelloが、変更されnewyorkませんか?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

2 番目の問題は、単純な perl ワンライナーで解決できます (1 行に 1 つの 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 に答える
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 に答える