加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何使用sed在文件中的每一行之前插入一行,原始行的内容

发布时间:2020-12-15 21:55:23 所属栏目:安全 来源:网络整理
导读:我试图使用sed(GNU sed版本4.2.1)在文件中的每一行之前插入一行,该行的内容由字符串围绕. 输入: truncate table ALPHA;truncate table BETA;delete from TABLE_CHARLIE where ID=1; 预期结果: SELECT 'truncate table ALPHA;' from dual;truncate table AL
我试图使用sed(GNU sed版本4.2.1)在文件中的每一行之前插入一行,该行的内容由字符串围绕.

输入:

truncate table ALPHA;
truncate table BETA;
delete from TABLE_CHARLIE where ID=1;

预期结果:

SELECT 'truncate table ALPHA;' from dual;
truncate table ALPHA;
SELECT 'truncate table BETA;' from dual;
truncate table BETA;
SELECT 'delete from TABLE_CHARLIE where ID=1;' from dual;
delete from TABLE_CHARLIE where ID=1;

我试图使用&符号(&)特殊字符,但这似乎不起作用.如果我在替换字符串上放了&符之后的任何内容,则输出不正确.

尝试1:

sed -e "s/(.*)/SELECT '&n&/g" input.txt

output:
SELECT 'truncate table ALPHA;
truncate table ALPHA;
SELECT 'truncate table BETA;
truncate table BETA;
SELECT 'delete from TABLE_CHARLIE where ID=1;
delete from TABLE_CHARLIE where ID=1;

使用前面的代码,我按预期得到了SELECT’,但是一旦我尝试添加’from dual;在字符串的右侧,事情变得糟糕.

尝试2:

sed -e "s/(.*)/SELECT '&' from dual;n&/g"  input.txt

output:
' from dual;cate table ALPHA;
truncate table ALPHA;
' from dual;cate table BETA;
truncate table BETA;
SELECT 'delete from TABLE_CHARLIE where ID=1;' from dual;

解决方法

您可以利用保留空间临时存储原始行.

sed "h;s/.*/'SELECT '&' from dual;/;p;g" input.txt

或者更可读:

sed "
h
s/.*/'SELECT '&' from dual;/
p
g" input.txt

这是命令的细分.

>首先,输入的每一行都放在模式空间中.
> h命令将模式空间的内容复制到保留空间.
> s命令在模式空间上执行替换. &表示匹配的内容.此命令使保留空间不受影响.
> p命令将模式空间的内容输出到标准输出.
> g命令将保留空间的内容复制到模式空间.
>默认情况下,在读取下一个输入行之前,模式空间的内容将写入标准输出.

正如Glenn Jackman指出的那样,你可以用G替换p; g.然后在模式空间中建立一个两行值,然后打印,而不是打印两个单独的模式空间.

sed "h;s/.*/'SELECT '&' from dual;/;G" input.txt

此外,您可以向sed命令添加注释,以便您可以了解线路噪声稍后会发生什么:),如果这是在脚本中.

sed " 
# The input line is first copied to the pattern space

h                               # Copy the pattern space to the hold space
s/.*/'SELECT '&' from dual;/    # Modify the pattern space
p                               # Print the (modified) pattern space
g                               # Copy the hold space to the pattern space

# The output of the pattern space (the original input line) is now printed
" input.txt

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读