Linux sed命令不会更改目标文件

时间:2013-01-17 20:02:22

标签: regex linux sed

使用我的shell脚本,当我运行./Test1 hello result

它应该将hello作为标准输入并将结果作为标准输出。 shell应该在<td></td>abc之前删除任何空格

所以,我这样编写脚本

tr -d [:blank:] < $1
grep -r "<td>" $1 | sed -r 's/<td>//g' > $2
sed -r 's/<\/td>//g' $2
sed -r 's/abc//g' $2

但是,当我运行此命令时,结果文件的内容与hello文件的内容完全相同(唯一的区别是删除了空格)

文件hello内容:

<td>hello</td>
  <td>hello</td>
    <td>hello</td>
<td>abc</td>
 <td>abc</td>

如何让sed将更改应用于目标文件?

6 个答案:

答案 0 :(得分:3)

如果要将sed的更改存储回文件,请使用-i选项:

$ cat file
<head>abc</head>
    <td>hello</td>
      <td>hello</td>
        <td>hello</td>
    <td>abc</td>
     <td>abc</td>
<h1>abc</h1>

$ sed -ni '/<td>/{s/^\s*//;s/abc//;s/<\/\?td>//g;p}' file

$ cat file
hello
hello
hello

修改:如果我们使用与sed不同的分隔符并使用扩展的正则表达式选项-r,则正则表达式会更清晰:

$ sed -r 's_</?td>__g' file
    hello
      hello
        hello
    abc
     abc

?使前一个字符可选,因此{rederxp匹配/<td>合二为一,而</td>不一定存在。

答案 1 :(得分:0)

如果您希望sed编辑现有文件,则应为其提供-i选项。

UPD:目前还不清楚你想对tr的结果做什么(现在它转到脚本的标准输出,是否打算?)

答案 2 :(得分:0)

grep解决方案:

kent$  echo "<td>hello</td>
  <td>hello</td>
    <td>hello</td>
<td>abc</td>
 <td>abc</td>"|grep -v 'abc'|grep -oP '(?<=<td>).*(?=</td>)'                                                                                                                
hello
hello
hello

awk解决方案:

kent$  echo "<td>hello</td>
  <td>hello</td>
    <td>hello</td>
<td>abc</td>
 <td>abc</td>"|awk -F"</?td>" '!/abc/{print $2}'
hello
hello
hello

答案 3 :(得分:0)

您只需要1个简单的sed或awk替换行:

sed -r 's/[[:blank:]]|<\/?td>|abc//g' file
awk '{gsub(/[[:blank:]]|<\/?td>|abc/,"")}1' file

e.g:

$ cat file
<td>hello</td>
  <td>hello</td>
    <td>hello</td>
<td>abc</td>
 <td>abc</td>

$ sed -r 's/[[:blank:]]|<\/?td>|abc//g' file
hello
hello
hello

答案 4 :(得分:0)

在sed命令中使用-i选项来更改文件本身,如果没有,则输出显示在屏幕上,但文件保持不变。

公式为:

sed -i <targetFile> 's/<beforeText>/<afterText>/g' <targetFile>

例如:

sed -i myCredentials.txt 's/secretPassword/xxx/g' myCredentials.txt

另一个选项-输出到另一个文件并重命名:

sed 's/secretPassword/xxx/g' myCredentials.txt > temp.txt
rm myCredentials.txt && mv temp.txt myCredentials.txt

有关更多信息,请参阅文档:

  

sed实用程序读取指定的文件,如果没有则读取标准输入        指定了文件,修改了由COM-列表指定的输入        。然后将输入写入标准输出。   可以将单个命令指定为sed的第一个参数。多        可以使用-e或-f选项指定命令。所有命令        按照指定的顺序应用于输入        它们的起源。

     

-i 就地编辑文件,保存具有指定扩展名的备份。                如果给出零长度的扩展名,则不会保存任何备份。它                不建议在原位使用零长度扩展                编辑文件,因为您可能会遭受损坏或原位内容的风险,                磁盘空间用尽的情况等。

答案 5 :(得分:-2)

如果您想要sed修改文件,则需要传递-e