修改一个文件而不创建另一个文件

Pra*_*ama 10 scripting text-processing files

有没有办法修改文件而不将内容写入另一个文件,没有sedawk

例如:

$ cat test.txt
aaa
aaa
bbb
ccc
ddd
Run Code Online (Sandbox Code Playgroud)

替换 using sedwith-i选项,sed -i 's/aaa/NNN/g' test.txt将产生以下结果:

NNN
NNN
bbb
ccc
ddd
Run Code Online (Sandbox Code Playgroud)

如何在没有awk和的情况下做到这一点sed

gar*_*Red 18

您可以使用vi脚本:

$ vi test.txt -c '%s/aaa/NNN/ | wq'
$ cat test.txt
NNN
NNN
bbb
ccc
ddd
Run Code Online (Sandbox Code Playgroud)

您只是自动执行vi在命令模式下使用时通常会输入的内容(Esc:通常使用访问):

% - 在每一行执行以下命令:

s/aaa/NNN/-aaaNNN

| - 命令分隔符

w - 将更改写入文件

q - 退出


Seb*_*ian 14

使用海绵

#!/bin/bash

pattern='aaa'
replacement='NNN'

while read -r line
do                                                                              
  printf '%s\n' "${line//$pattern/$replacement}"
done < "${1}"
Run Code Online (Sandbox Code Playgroud)

致电:

./script.sh test.txt | sponge test.txt
Run Code Online (Sandbox Code Playgroud)


don*_*sti 12

使用ed,行编辑器:

ed -s test.txt <<< $',s/pattern/replace/g\nw\nq'
Run Code Online (Sandbox Code Playgroud)

或者

ed -s test.txt <<IN
,s/pattern/replace/g
w
q
IN
Run Code Online (Sandbox Code Playgroud)

或者

printf '%s\n' ,s/pattern/replace/g w q | ed -s test.txt
Run Code Online (Sandbox Code Playgroud)


Fra*_*nki 5

如果使用bashksh,则可以对 shell 变量使用模式替换。但是请注意,基本的 shell glob 功能较弱,而扩展的 shell glob 具有一些 sed 没有的功能,反之亦然。有关更多详细信息,请参阅中的“参数扩展” man 1 bash

t=$(< test.txt); printf '%s\n' "${t//aaa/NNN}" >test.txt
Run Code Online (Sandbox Code Playgroud)

默认情况下禁用扩展的 shell glob,因此您可能需要显式启用它们:

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)