使用我的 shell 脚本,当我运行./Test1 hello result.
它应该hello作为标准输入和结果作为标准输出。外壳应该之前删除任何空白<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
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此命令时,结果文件的内容与 hello 文件的内容完全相同(唯一的区别是删除了空格)
文件你好内容:
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>abc</td>
<td>abc</td>
Run Code Online (Sandbox Code Playgroud)
如何sed将更改应用到目标文件?
如果要将更改从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
Run Code Online (Sandbox Code Playgroud)
编辑:如果我们使用不同的分隔符sed并使用扩展的正则表达式选项,正则表达式会更清晰-r:
$ sed -r 's_</?td>__g' file
hello
hello
hello
abc
abc
Run Code Online (Sandbox Code Playgroud)
在?前面的字符可选的,所以化妆/不必存在使得正则表达式匹配<td>,并</td>于一体。
在 sed 命令中,使用 -i 选项来更改文件本身,如果没有,输出将打印在屏幕上,但文件保持不变。
公式为:
sed -i <targetFile> 's/<beforeText>/<afterText>/g' <targetFile>
Run Code Online (Sandbox Code Playgroud)
例如:
sed -i myCredentials.txt 's/secretPassword/xxx/g' myCredentials.txt
Run Code Online (Sandbox Code Playgroud)
另一种选择- 输出到另一个文件并重命名:
sed 's/secretPassword/xxx/g' myCredentials.txt > temp.txt
rm myCredentials.txt && mv temp.txt myCredentials.txt
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看文档:
sed 实用程序读取指定的文件,如果未指定文件,则读取标准输入,并按照命令列表指定的方式修改输入。然后将输入写入标准输出。可以将单个命令指定为 sed 的第一个参数。可以使用 -e 或 -f 选项指定多个命令。所有命令都按照指定的顺序应用于输入,无论其来源如何。
-i 就地编辑文件,使用指定的扩展名保存备份。如果给出零长度扩展,则不会保存备份。不建议在就地编辑文件时提供零长度扩展名,因为在磁盘空间耗尽等情况下可能会出现损坏或部分内容的风险。