我试图使用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)
您可以利用保留空间临时存储原始行.
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)
这是命令的细分.
h命令将模式空间的内容复制到保留空间.s命令在模式空间上执行替换.该&代表无论是匹配的.此命令使保留空间不受影响.p命令将模式空间的内容输出到标准输出.g命令将保留空间的内容复制到模式空间.正如格伦杰克曼指出的那样,你可以p;g用G.这会在图案空间中建立一个双线值,然后打印,而不是打印两个单独的图案空间.
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)
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |