2016-07-07 66 views
0

我正在嘗試修改我的腳本。將文本修改爲文件

create table T1 
a, 
b) 
/
INSERT... 
/
UPDATE ... 
/
create table T2 
a, 
b) 
/

我想修改類的文件:

create table T1 
a, 
b) TABLESPACE TS 
/
INSERT... 
/
UPDATE ... 
/
create table T2 
a, 
b) TABLESPACE TS 
/

所以我希望得到的字上面的「創建表」和「/」,並補充說,單詞「TABLESPACE TS」文本「/ 」。 有人可以幫我什麼選項,我可以在這裏使用sed命令?

+0

接着說:bash'標籤。如果你沒有使用bash,可以隨意回滾到以前的版本 – sjsam

回答

0

輸入

create table T1 
a, 
b) 
/
create table T2 
a, 
b) 
/
Some Stuff 
b) 
/
b) again 

腳本

sed '/^create table/{:l1;n;/^\/$/!{s/^b)$/b) TABLESPACE TS/g;b l1}}' file 

輸出

create table T1 
a, 
b) TABLESPACE TS 
/
create table T2 
a, 
b) TABLESPACE TS 
/
Some Stuff 
b) 
/
b) again 

這裏發生了什麼?

  • 我們在此處使用sed流編輯器。
  • s選項sed它意味着替代。
  • s格式爲s/pattern/replacement/g其中g標誌服務於全局替換。
  • :l1用於打印當前空間後,以指定的標籤l1
  • n增加下一行到圖案空間。
  • !{group}用於否定一組命令。在我們的例子中,它表示如果匹配的模式/不要嘗試{group}的命令。
  • b適用於無條件跳轉到標籤。所以b l1跳轉到標籤l1
  • 現在根據這些要點來閱讀答案。

注意

SEd本身擴大到流編輯器。欲瞭解更多信息,請查詢[ this ]

+0

還有其他的文字以及單詞「/」,以便替換不會工作。要抓住「create table」和「/」之間的塊,然後需要修改。其他文本需要保持不變。 –

+0

@AjaySingh:我明白了。該要求最初沒有提到。我會馬上更新。 – sjsam

+0

@AjaySingh:我已經更新以符合現在的要求。 – sjsam

0

使用/作爲記錄分隔符。

awk -v RS=/ -v ORS=/ -v IGNORECASE=1 ' 
    /create table/ { print $0, "TABLESPACE TS\n";next } 
    $0 != "\n" 
    END {printf("\n")}' inputfile > outputfile 
0

與GAWK

awk 'BEGIN{RS="\n/"} {printf "%s",$0} /create/{printf "%s"," TABLESPACE TS"} {printf "%s",RS}' file 

輸出

create table T1 
a, 
b) TABLESPACE TS 
/
INSERT... 
/
UPDATE ... 
/
create table T2 
a, 
b) TABLESPACE TS 
/

BEGIN{RS="\n/"} #set RS 
    {printf "%s",$0} # print record 
    /create/{printf "%s"," TABLESPACE TS"} #append if create is present in record 
    {printf "%s",RS} # append seperator 
+1

由於多字符RS,您應該提及這是gawk特有的。此外,總是使用'printf'%s「,$ 0'而不是'printf $ 0'-想象當$ 0包含printf格式化字符如'%s'時的區別。 –

+0

這工作像魅力。非常感謝。 –

+0

供參考http://stackoverflow.com/help/accepted-answer – Chet