【问题标题】:Match word after pattern and append a suffix in a file using sed?在模式之后匹配单词并使用sed在文件中附加后缀?
【发布时间】:2019-11-25 17:57:56
【问题描述】:

我有多个这样的文件:

CREATE TABLE VAI_TEST
   (
      TEST VARCHAR2(4000)
   ) ;

只有第一行是相关的。我需要用 VAI_TEST_TEMP 替换 VAI_TEST。 结果应该是这样的:

CREATE TABLE VAI_TEST_TEMP
   (
      TEST VARCHAR2(4000)
   ) ;

我发现了多个匹配 VAI_TEST 的正则表达式模式,例如

  • (?:CREATE TABLE )([A-Za-z_]*)[\r\n]
  • (?:.* TABLE )(.*$)
  • CREATE TABLE (.*)\n
  • (?:.* TABLE )(.*)\n

可能有更多更好的模式。 我的问题是将捕获组1的内容替换为内容和后缀。

我尝试了多种 sed 组合,但几乎没有任何反应,或者我收到错误正则表达式模式(带有 -r 标志)或无效引用 \1(带有 -e)标志的错误。

最后我想在 bash 脚本中使用该命令。此外,如果可以将新名称保存在变量中以便在进一步的步骤中使用它,那将很有帮助。

有什么好的方法可以做到这一点?

【问题讨论】:

  • sed 's/VAI_TEST$/&_TEMP/' filesed 's/CREATE TABLE .*/&_TEMP/' file
  • 这对你有用吗?如果没有,有什么问题?请出示您的脚本。
  • VAI_TEST 对此的实际了解是什么?看起来像非空格 \S/CREATE[ \t]+TABLE[ \t]+(\S+)/ 这样的东西可能是有益的。
  • 我应该提到 VAI_TEST 是可变的。所以每个文件都有自己的名字。在下一个文件中,它是例如VAI_STATUS。
  • 为什么不简单:sed 's|VAI_TEST|VAI_TEST_TEMP|'?我认为不需要使用捕获组等。

标签: regex linux bash shell sed


【解决方案1】:

sed '/^CREATE TABLE/s/[^ ]*$/&_TEMP/' file

  • /^CREATE TABLE/ - 以“CREATE TABLE”开头的行,
  • s/[^ ]*$/ - 将结束行 ($) 前的非空格字符 ([^ ]) 替换为:
  • &_TEMP - &——不管这些字符是什么——后缀为“_TEMP”

【讨论】:

    【解决方案2】:

    考虑

    sed -i 's/CREATE TABLE [^[:space:]]\{1,\}$/&_TEMP/' file
    

    [^[:space:]] 用于除空格以外的任何符号,\{1,\} 重复它一次或多次。 & 代表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2016-08-27
      相关资源
      最近更新 更多