如何使用sed在文件中的每一行之前插入一行,原始行的内容由字符串围绕?

RAM*_*tle 5 bash sed

我试图使用sed(GNU sed版本4.2.1)在文件中的每一行之前插入一行,该行的内容由字符串围绕.

输入:

truncate table ALPHA;
truncate table BETA;
delete from TABLE_CHARLIE where ID=1;
Run Code Online (Sandbox Code Playgroud)

预期结果:

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;
Run Code Online (Sandbox Code Playgroud)

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

尝试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;
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,我得到了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;
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

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

sed "h;s/.*/'SELECT '&' from dual;/;p;g" input.txt
Run Code Online (Sandbox Code Playgroud)

或者更可读:

sed "
h
s/.*/'SELECT '&' from dual;/
p
g" input.txt
Run Code Online (Sandbox Code Playgroud)

这是命令的细分.

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

正如格伦杰克曼指出的那样,你可以p;gG.这会在图案空间中建立一个双线值,然后打印,而不是打印两个单独的图案空间.

sed "h;s/.*/'SELECT '&' from dual;/;G" input.txt
Run Code Online (Sandbox Code Playgroud)

此外,您可以为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
Run Code Online (Sandbox Code Playgroud)