[英]Moving matching lines in a text file using sed
我正在努力关注这篇文章
如何使用regexp匹配(bash脚本)将文件中的指定行移动到其他位置?
到我的示例文件
asdasd0
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
asdasd2
asdasd3
asdasd4
DEFAULTS {
asdasd6
最终输出应该是这样的
asdasd0
asdasd2
asdasd3
asdasd4
DEFAULTS {
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
asdasd6
我尝试了以下内容
sed "/-SRC_OUT_DIR.*/d;/DEFAULTS { /a"$(sed -n '/-SRC_OUT_DIR.*/p' test.txt) test.txt`
但它不起作用。 我得到以下输出
sed:can't read =: No such file or directory
sed:can't read "/a/b/c/d/e/f/g": No such file or directory
asdasd0
asdasd2
asdasd3
asdasd4
DEFAULTS {
-SRC_OUT_DIR
asdasd6
我也想知道为什么我不能使用\\1
, \\2
打印需要移动的行。 我试过了,但没有打印。 如果我需要将多个匹配行移动到文件中的不同位置,我将如何编写sed
命令?
当你问一个sed
解决方案时,我会建议使用awk
。 不建议使用大量sed
命令的丑陋嵌套。 特别是因为你读了两次文件。
这是一个awk
awk '/SRC_OUT_DIR/{t=$0;next}1;/DEFAULTS/{print t}' file
它是如何工作的?
awk将逐行读取您的file
。 每行,它将一个接一个地执行以下三个命令:
/SRC_OUT_DIR/{t=$0;next}
:如果该行包含与SRC_OUT_DIR
匹配的子字符串,则将该行存储在变量t
并移至next
行(不执行2和3) 1
:默认动作:打印行 /DEFAULTS/{print t}
:如果当前行包含子字符串DEFAULTS
,则打印存储在变量t
的行 如果你有多条线要移动(这只是向下移动):
awk '/pattern1/ {t[1]=$0;next}
/pattern2/ {t[2]=$0;next}
/pattern3/ {t[3]=$0;next}
/target3/ { print t[3] }
1
/target1/ { print t[1] }
/target2/ { print t[2] }' file
请注意, pattern3
将在target3
之前target3
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.