Bash 当对行首进行查找和替换时,如何将字符添加到行尾?

Bash 当对行首进行查找和替换时,如何将字符添加到行尾?,bash,sed,replace,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#^? #

我正在创建一个将自定义标记转换为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

当在行首找到“?”时,如何使它也将
}{
添加到末尾,当在行首找到“-”时,如何将
}
添加到末尾?

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

sed -e 's#^? \(.*\)#\\QUESTION{\1}{' -e 's#^- \(.*\)#\\ANSWER{\1}#' -e 's#^e#}#'
在这个命令中,
\(…\)
是捕获组,
\1
指的是它们的内容

我还冒昧地将您的多个
s
替换重新组合到一个
sed
命令中。

如下:

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

但是,是的,可能是微优化。

你也可以试试这个:

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