簡體   English   中英

sed 命令在某個模式之后添加一行

[英]sed command to add a line after some pattern

我有一個文件(內容如下)

name = [
    "victor",
    "linda",
    "harris",
    "sandy"
] 

現在如何添加命令(使用 sed 或 awk 的 shell),我需要以下輸出

name = [
    "NEW INPUT HERE",
    "victor",
    "linda",
    "harris",
    "sandy"
] 

我嘗試了多種方法,但無法實現。 我試過的很少 sed '2a'$'\n'' "NEW INPUT HERE", ' filename

我可以添加它,但在我輸入后沒有換行

有些sed很挑剔,但以下每個都應該工作:

$ sed -e '1a\
    "NEW INPUT HERE",
' input-file

$ sed -e $'1a\\\n    "NEW INPUT HERE",\n' input-file # Bashism

使用 GNU sed 為我工作:

sed '2i\    "NEW INPUT HERE",'

或者

sed '1a\    "NEW INPUT HERE",'

這將僅用於新行,無論您已經對現有的第二行使用了什么縮進:

$ awk -v new='"NEW INPUT HERE",' 'NR==2{orig=$0; sub(/[^[:space:]].*/,""); print $0 new; $0=orig} 1' file
name = [
    "NEW INPUT HERE",
    "victor",
    "linda",
    "harris",
    "sandy"
]

使用sed

$ sed '2{h;s/[[:alpha:]][^"]*/NEW INPUT HERE/};2G' input_file
name = [
    "NEW INPUT HERE",
    "victor",
    "linda",
    "harris",
    "sandy"
]

另一種選擇是匹配[和下一行。

然后捕獲第 1 組中的換行符和前導空格。

在替換中,使用雙引號括起來的文本和對第 1 組的反向引用以保持縮進相同。

sed -E '/\[/{N;/(\n[[:blank:]]+)/{s//\1"NEW INPUT HERE",\1/}}' file

輸出

name = [
    "NEW INPUT HERE",
    "victor",
    "linda",
    "harris",
    "sandy"
]

這可能對您有用(GNU sed):

sed '2{h;s/\S.*/"NEW INPUT HERE",/p;g}' file

在第 2 行,復制該行,從現有文本開始縮進的地方替換所需的字符串,打印修改后的行並恢復原始行。

使用正則表達式作為地址行的另一種解決方案:

sed '/name = \[/{n;h;s/\S.*/"NEW INPUT HERE",/p;g}' file
awk -v str='"NEW INPUT HERE",' '
    /name/{
           print; 
           getline;                                 # get first element (victor)
           le=length($0)-length($1);                # calculate first element ident  
           printf "%*s%s \n%s\n", le, " ", str, $0;
           next
}1' file

name = [
    "NEW INPUT HERE", 
    "victor",
    "linda",
    "harris",
    "sandy"
] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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