我正在创建一个简单的脚本,将自定义标记转换为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
如何获得将}{
也添加到“?”末尾的信息?是否位于开头,并在行的开头找到“-”时在末尾添加}
?
答案 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