在开始处执行查找和替换后,如何在行末添加字符?

时间:2018-09-03 15:03:34

标签: bash sed replace

我正在创建一个简单的脚本,将自定义标记转换为TeX宏:

? What are four kinds of animals?
- elephants
- tigers
- bears
- fish
e

它变成:

\QUESTION{What are four kinds of animals?}{
\ANSWER{elephants}
\ANSWER{tigers}
\ANSWER{bears}
\ANSWER{fish}
}

我使用一种简单的语法替换了前面的项目:

sed 's#^? #\\QUESTION{#' file > temp1
sed 's#^\- #\\ANSWER{#' temp1 > temp2
sed 's#^e #\}{#' temp2 > temp3

如何获得将}{也添加到“?”末尾的信息?是否位于开头,并在行的开头找到“-”时在末尾添加}

3 个答案:

答案 0 :(得分:1)

匹配整行而不是其开头,并使用替换模式引用该行的内容:

sed -e 's#^? \(.*\)#\\QUESTION{\1}{' -e 's#^- \(.*\)#\\ANSWER{\1}#' -e 's#^e#}#'

在此命令中,\(...\)捕获组,\1引用其内容。

我也很乐意用一个s命令将您的多个sed团体重新组合。

答案 1 :(得分:1)

赞:

sed -E 's/^(\? )(.*)/\\QUESTION{\2}{/;t;s/- (.*)/\ANSWER{\1}/;t;s/e/}/' file

说明:

  • s/^(\? )(.*)/\\QUESTION{\2}{/处理以?开头的行
  • t表示如果上述s命令替换了某些内容,则不会采取进一步行动
  • s/- (.*)/\ANSWER{\1}/处理以-开头的行
  • t表示如果上述s命令替换了某些内容,则不会采取进一步行动
  • s/^e/}/处理以e开头的行。

您可以通过根据搜索模式的复杂程度对命令进行重新排序来“加快速度”,如下所示:

sed -E 's/e/}/;t;s/- (.*)/\ANSWER{\1}/;t;s/^(\? )(.*)/\\QUESTION{\2}{/;' file

但是,可能是微观优化。

答案 2 :(得分:1)

您也可以尝试此sed:

sed '/^- /s//\\ANSWER{/;/^e/s///;s/$/}/;/^? /{s//\\QUESTION{/;s/$/{/}' infile


sed '
  /^- /s//\\ANSWER{/  # line with -
  /^e/s///            # line with e
  s/$/}/              # add } at the end of each line  
  /^? / {             # line with ?
    s//\\QUESTION{/
    s/$/{/
  }
' infile