Bash 当对行首进行查找和替换时,如何将字符添加到行尾?
我正在创建一个将自定义标记转换为TeX宏的简单脚本: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#^? #
? 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