替换特定行之前的字符串

替换特定行之前的字符串

我有一个文件,例如:

ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0  COMPRESS 0 ,
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR ,
PRIMARY INDEX ( CALENDAR_DATE );

我想将包含 PRIMARY 的行之前的行中的 ',' 替换为 ')'。

结果应该是:

ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0  COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );

答案1

使用GNU sed

sed  'N;s/,\(\s*\n.*PRIMARY\)/)\1/;P;D' file

ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0  COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );
  • N 将下一行输入读取/附加到模式空间中。
  • P 打印到当前模式空间的第一个嵌入换行符。
  • D 最多删除模式空间中第一个嵌入的换行符。开始下一个周期,但如果模式空间中仍有数据,则跳过从输入读取。

答案2

尝试反转文件,在线进行字符串替换PRIMARY,然后重新反转文件:

tac file | sed '/PRIMARY/ {n; s/,$/)/}' | tac

答案3

尝试这个,

perl -0777 -pe 's/,([^\n,]*\n[^\n]*PRIMARY)/)$1/g'

这会将包含 在内的任何行之前的最后一个替换,为in 行。)PRIMARY

解释

  • perl -0777slurp 整个文件(读为一行)
  • s/search_pattern/replacement/g全局替换搜索模式

答案4

POSIX- sed您可以执行以下操作:

sed -e '
    /PRIMARY/!{x;1!p;d;}
    x;s/,/)/;$G
' input-file.txt

输出:

ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0  COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );

在职的:

  • 对于非 PRIMARY 行,我们保存该行并打印我们在保留中保存的行。
  • 对于 PRIMARY,我们检索前一个并进行转换。

相关内容