将字符串从一行提取到另一行并替换

时间:2014-11-17 23:54:15

标签: bash

我有一个包含

的文本文件
CREATE TABLE attribute_type
ALTER TABLE table ADD PRIMARY KEY...,
ALTER TABLE table ADD CONSTRAINT...
CREATE TABLE attribute_type_options
ALTER TABLE table ADD PRIMARY KEY...,
ALTER TABLE table ADD CONSTRAINT...,
CREATE INDEX person_attribute_type_set ON table...,
ALTER TABLE table ADD CONSTRAINT...
...
...

我想删除以 CREATE TABLE table_name word table_name 开头的行,并在找到以下行之前替换以下行中的单词 table CREATE TABLE ...

的新行

输出应为

CREATE TABLE attribute_type

ALTER TABLE attribute_type ADD PRIMARY KEY...,
ALTER TABLE attribute_type ADD CONSTRAINT...

CREATE TABLE attribute_type_options

ALTER TABLE attribute_type_options ADD PRIMARY KEY...,
ALTER TABLE attribute_type_options ADD CONSTRAINT...,
CREATE INDEX person_attribute_type_set ON attribute_type_options...,
ALTER TABLE attribute_type_options ADD CONSTRAINT...
...
...

我做某事......但是没有用!

#!/bin/bash

while read line
do
   if [[ "$line" =~ ^CREATE.* ]]; then
      #would need to do something like
      #name=`awk '{print $3}' $line`
   else
      #sed -i 's/table/name/' $line
   fi
done < $1

如何正确地做到这一点?

1 个答案:

答案 0 :(得分:0)

这会接收文件input,进行替换,并写入文件output

awk '{if (/^CREATE TABLE/) {name=$3} else sub("table", name);print}' input >output

如何运作

  • if (/^CREATE TABLE/) {name=$3}

    如果该行以CREATE ALTER开头,则我们将第三个字段保存为名称。

  • else sub("table", name)

    否则,我们会在任意一行找到table的第一个匹配项,并将其替换为变量name中保存的值。

  • print

    最后,我们打印出该行。

实施例

使用当前版本问题的示例输入,生成的输出为:

$ awk '{if (/CREATE TABLE/) {name=$3} else sub("table", name);print}' input
CREATE TABLE attribute_type
ALTER TABLE attribute_type ADD PRIMARY KEY...,
ALTER TABLE attribute_type ADD CONSTRAINT...
CREATE TABLE attribute_type_options
ALTER TABLE attribute_type_options ADD PRIMARY KEY...,
ALTER TABLE attribute_type_options ADD CONSTRAINT...,
CREATE INDEX person_attribute_type_set ON attribute_type_options...,
ALTER TABLE attribute_type_options ADD CONSTRAINT...
...
...

此代码是在更新问题之前编写的,该问题在输出中添加了空行。