簡體   English   中英

使用sed在文本文件中移動匹配行

[英]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 '/^-SRC_OUT_DIR/{h;d;};/^DEFAULTS {/G' infile
asdasd0
asdasd2
asdasd3
asdasd4
DEFAULTS {
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
asdasd6

當你問一個sed解決方案時,我會建議使用awk 不建議使用大量sed命令的丑陋嵌套。 特別是因為你讀了兩次文件。

這是一個awk

awk '/SRC_OUT_DIR/{t=$0;next}1;/DEFAULTS/{print t}' file

它是如何工作的?

awk將逐行讀取您的file 每行,它將一個接一個地執行以下三個命令:

  1. /SRC_OUT_DIR/{t=$0;next}如果該行包含與SRC_OUT_DIR匹配的子字符串,則將該行存儲在變量t並移至next行(不執行2和3)
  2. 1默認動作:打印行
  3. /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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM