sed
我正在尝试使用或任何其他合适的 Unix 工具自动执行罗马尼亚语文本的特定文本替换任务。这是我的要求:
- 将字母的所有实例替换
â
为î
内部单词。 - 词根为“român”的单词(如“Românească”、“româneşte”等)应保持不变。
- “sunt”一词应替换为“sînt”。
例如:
输入:
până
împământenit
român
Românească
sunt
cugetând
预期输出:
pînă
împămîntenit
român
Românească
sînt
cugetînd
我尝试了几个sed
脚本,但没有一个能够同时满足所有要求。有人可以指导我吗?我将不胜感激任何帮助或建议!
答案1
正如你所描述的那样,
sed '/[rR]omân/!s/â/î/g;s/sunt/sînt/g'
将完成以下工作:
s/â/î/g
ubstitures
是否所有(g
局部)出现â
withî
- “地址”
/[rR]omân/
被 反转!
,因此以下命令将不适用于包含该模式的行 s/sunt/sînt/g
最后取代了该词,也作为成分的一部分
注意:在您的示例中,ă
也会被替换。如果这是需要的,你需要
sed '/[rR]omân/!s/[âă]/î/g;s/sunt/sînt/g'
答案2
使用乐(以前称为 Perl_6)
~$ raku -ne 'S:g/â/î/ andthen \
S:samecase:g/ (<[rR]>om) (î) (n) /$0â$2/ andthen \
S:g/sunt/sînt/ andthen .put;' file
输入示例:
până
împământenit
român
Românească
sunt
cugetând
示例输出:
pînă
împămîntenit
român
Românească
sînt
cugetînd
Raku 有-ne
非自动打印命令行标志。替换时,您可以使用 Raku 的“big-S”S///
表示法 返回结果字符串。
连接器上方andthen
将重新加载主题变量 ( $_
),因此每个后续S///
操作都适用于先前修改的文本。最后一个子句andthen .put
重新加载主题变量 ( $_
) 并打印出最终文本(.put
是 的缩写$_.put
)。
请注意,您可能更喜欢使用 Unicode 名称,因为它可以节省剪切/粘贴特殊字符的时间。因此,在 Raku 中,第一个元音替换实际上可以写成如下:
S:g/\c[LATIN SMALL LETTER A WITH CIRCUMFLEX]/\c[LATIN SMALL LETTER I WITH CIRCUMFLEX]/