$ 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
答案 0 :(得分:0)
为什么rome
更改为hello
但newyork
不是?如果我正确地阅读了这个问题,那么您是否尝试使用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;
}