回显或预览使用sed-i更改的文本

回显或预览使用sed-i更改的文本,sed,Sed,使用sed可以轻松更改多个文件中的文本,例如: sed -i 's/cashtestUS/cheque_usd/g' *.xml 问题在于,这具有巨大的威力,而复杂的正则表达式很容易产生无法预料的后果 有没有一种简单的方法可以做到: 1) 响应所做的更改 2) 在预览模式下运行sed,以便可以预览潜在的更改在预览模式下运行,而无需使用-i: sed -e 's/cashtestUS/cheque_usd/g' *.xml (不需要-e;它只是说下一个参数是sed脚本,或者sed脚本的一部分

使用sed可以轻松更改多个文件中的文本,例如:

 sed -i 's/cashtestUS/cheque_usd/g' *.xml
问题在于,这具有巨大的威力,而复杂的正则表达式很容易产生无法预料的后果

有没有一种简单的方法可以做到:

1) 响应所做的更改

2) 在预览模式下运行sed,以便可以预览潜在的更改

在预览模式下运行,而无需使用
-i

sed -e 's/cashtestUS/cheque_usd/g' *.xml
(不需要
-e
;它只是说下一个参数是
sed
脚本,或者
sed
脚本的一部分。)这会将所有输出写入标准输出。您可能会通过
less
(或
more
)传递它,或通过
grep
查看更改的行是否符合您的预期。或者,您可以一次处理一个文件,然后运行不同的程序:

for file in *.xml
do
    echo "$file"
    sed -e 's/cashtestUS/cheque_usd/g' "$file" | diff -u "$file" -
done

或者…

sed有几个“调试/显示操作”

  • =
    显示当前行号
  • l
    显示当前工作缓冲区内容,内容末尾有一个
    $
  • i
    a
    可用于显示类似
    i的跟踪\
    此处调试跟踪
  • 如果未使用保持缓冲器,则a
    h;s/*/Debug Trace here/;g
    是有用的,不会出现在治疗结束时,如
    i
    a
样本:

echo "line 1
and two" | sed ':a
=;h;s/.*/Before substitution/;g;l
s/..$/-/
=;l
t a'

2020年:关于上述内容,您是否可以分享如何在*.php、*.inc文件上递归读取文件夹及其所有子文件夹中的“for”,然后执行“sed”操作。。。我们可以从命令行运行的类似全局搜索和替换的东西?我知道打印行号很困难,但至少通过这种方法,你可以看到文件名正在运行on@MarcoZen-这不再是一个
sed
问题,而是一个shell问题。假设Bash的版本足够新(4.x可能–4.3起作用;默认情况下不是macOS上的3.x版本),您可以使用
shopt-s globstar
,然后在**/*.inc**/*.php中对文件使用
;做…任何事…;完成
(请参阅)。您可能还想使用
shopt-s nullglob
。很可能
zsh
有一个等效的机制;我不知道其他的炮弹。这变成了一个无限的命令。。。不要跑。。。在opensuse 42.3盒上。。。