8

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

它应该hello作为标准输入和结果作为标准输出。<td>shell 应该删除,</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将更改应用到目标文件?

4

6 回答 6

7

如果要将更改从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

使?前一个字符可选,因此/不必存在使正则表达式匹配<td>并合二为一</td>

于 2013-01-17T20:10:47.460 回答
3

在 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 实用程序读取指定的文件,如果没有指定文件,则读取标准输入,根据命令列表修改输入。然后将输入写入标准输出。可以将单个命令指定为 sed 的第一个参数。可以使用 -e 或 -f 选项指定多个命令。所有命令都按照指定的顺序应用于输入,无论其来源如何。

-i 就地编辑文件,以指定的扩展名保存备份。如果给出零长度扩展名,则不会保存备份。不建议在就地编辑文件时提供零长度扩展名,因为在磁盘空间耗尽等情况下,您可能会面临损坏或部分内容的风险。

于 2019-12-04T12:58:03.733 回答
0

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

UPD:不清楚你想对结果做什么tr(现在它进入脚本的标准输出,是有意的吗?)

于 2013-01-17T20:04:22.340 回答
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
于 2013-01-17T21:38:08.387 回答
0

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

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

例如:

$ 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
于 2013-01-17T23:45:37.437 回答
-2

如果要 sed 修改文件,则需要通过 -e

于 2013-01-17T20:04:29.030 回答