Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 将内联替换为sed,但也替换为打印输出_Unix_Sed_Replace - Fatal编程技术网

Unix 将内联替换为sed,但也替换为打印输出

Unix 将内联替换为sed,但也替换为打印输出,unix,sed,replace,Unix,Sed,Replace,我正在尝试内联修改文件,例如 sed -i -e 's/^bantime = 600/bantime = 86400/' /etc/fail2ban/jail.conf 我还想将此更改的结果输出到日志文件。结果可以是任何东西,但理想情况下,我希望得到一些积极的肯定,即进行了更改。以下是如何让sed-I(内联sed)将其进度打印到标准输出,无论是否进行了更改: $ echo 'bantime = 600' > jail.conf $ sed -i -e 's/^bantime = 30

我正在尝试内联修改文件,例如

sed -i -e 's/^bantime  = 600/bantime  = 86400/' /etc/fail2ban/jail.conf

我还想将此更改的结果输出到日志文件。结果可以是任何东西,但理想情况下,我希望得到一些积极的肯定,即进行了更改。

以下是如何让
sed-I
(内联sed)将其进度打印到标准输出,无论是否进行了更改:

$ echo 'bantime = 600' > jail.conf
$ sed -i -e 's/^bantime = 300/bantime = 86400/g; w /dev/stdout' jail.conf
bantime = 86400
$ cat jail.conf
bantime = 86400
如果重复运行上述命令而不重置
jail.conf
,则不会进行任何更改,但
sed
仍将打印相同的输出

若要仅打印更改的行,请删除上一行中的分号。例如:

$ echo 'asdf\nbantime = 600' > jail.conf
$ echo 'a second line of text' >> jail.conf
$ sed -i -e 's/^bantime = 600/bantime = 86400/g w /dev/stdout' jail.conf
bantime = 86400
$ cat jail.conf
bantime = 86400
a second line of text
最后,要保存备份,可以将扩展名传递给
-i
开关:

$ echo 'asdf\nbantime = 600' > jail.conf
$ echo 'a second line of text' >> jail.conf
$ sed -i .old -e 's/^bantime = 600/bantime = 86400/g w /dev/stdout' jail.conf
bantime = 86400
$ cat jail.conf
bantime = 86400
another line of text
$ cat jail.conf.old
bantime = 600
another line of text
只需使用awk:

awk -i inplace 'sub(/^bantime  = 600/,"bantime  = 86400"){ print "Replaced line", NR, $0 |"cat>&2" } 1' /etc/fail2ban/jail.conf

上面使用GNU awk进行就地编辑(就像GNU sed对
-i
所做的那样),并且可以在每次替换时将任何您喜欢的消息打印到stderr(或者通过修改
cat>&2
)打印到任何您喜欢的地方。

您的一行代码似乎只打印更改,而不是修改文件。您可以使用
“/dev/stderr”
而不是管道连接到
cat
,可以吗?是的,但是它不能移植到所有UNIX设备上。谢谢!第一个脚本打印整个文件(不是很有用);然而,第二个脚本块(“只打印更改的行…”)正是我要找的。@Christian,很高兴听到这个消息!在回答的过程中,我学到了一些关于sed的知识:)