gpt4 book ai didi

linux - 如何用同一文本行中的尾随字符替换字符匹配项?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:56 26 4
gpt4 key购买 nike

我正在使用 pdftotext 来转换西类牙语文本。带有重音符或波浪号的字符以需要进一步转换的系统方式输出。重音符和波浪号出现在转换后的文本中的正确位置,但没有字母。字母几乎总是出现在输出行的末尾。如果没有,我可以手动修复它们。

例如pdf语句

¿Por qué?

成为

¿Por qu´? e

我对 sed、awk 和 grep 有足够的了解,认为可以通过它们的某种组合来完成——这将花费我很长时间。我打算用它来处理文件夹中的所有 pdf 文件。

句子以西类牙语-英语成对出现在不同的行上。我想用分号分隔符将两者连接起来,这是我的闪存卡应用程序 (Anki) 的导入格式。删除所有非西英句对的内容。

例如,转换这个输出

B:

¿Por qu´? e
Why?

进入

¿Por qué?;Why?

如果有多个重音符、波浪号或两者的混合,则该行后面的字母顺序正确,并且可以用逗号分隔。比如pdf语句

Sí pero vi en la televisión que iba a llover.

成为

S´ pero vi en la televisi´n que iba a llover. ı, o

或者 S´ pero vi en la televisi´n que iba a llover。我啊

输出文件格式

句子总是有结束标点符号,“!”,“?”或者 ”。”。对于那些不熟悉西类牙语的人,元音 (aeiou) 是唯一可能带有重音符号的字母,字母“n”是唯一可能带有波浪号的字母,并且这 2 个特殊字符可能在大写字母和小写字母中都可以找到.

第一个输出行可能包含 pdf 的级别和标题。级别和标题始终在第一次出现的“A:”之前

我对“Key Vocabulary”行或任何后续行中出现的任何内容不感兴趣。

pdftotext 使用 UTF8 编码运行。我的操作系统是基于 Ubuntu 10.04 的 Linux Mint 9

下面是两个示例输出文件。

输出1

Elementary - Credit Card A:

(B0089)

Me da la cuenta, por favor.
Bring me the check, please.

B:

Se la doy enseguida.
I’ll bring it to you right away.

B:

Perd´n se˜or, pero no aceptamos tarjeta. o n
Sorry sir, but we don’t take cards.

A:

¿No aceptan ninguna tarjeta de cr´dito? e
You don’t take any credit cards?


Key Vocabulary

tarjeta cr´dito e cuenta

Noun Noun Noun

card credit bill

输出2

Elementary - My computer is not working A: ¡No puede ser!
It can’t be!

(B0079)

B:

¿Qu´ pasa? e
What happened?

A:

Mi computadora no est´ funcionando. a
My computer is not working.

B:

Rein´ ıciala.
Restart it.


Key Vocabulary

funcionar

Verb

to work

最佳答案

编辑:对 NR == 1 行进行细微更改以适应输入文件第一行的变化。为此,它取决于“A:”仅在第一行出现一次。

我还应该补充一点,这个程序依赖于 GNU AWK (gawk) 的特性。

您的两个输出示例之间似乎有些不一致。下面的程序适用于第一个程序。在第二个示例中,此行包含标题和数据行:

Elementary - My computer is not working A: ¡No puede ser!

并且此行包含要在行内而不是在最后一个标点符号之后替换的字符。

Rein´ ıciala.

如果需要,可以通过修改程序来解决这些问题。

此外,您提到这些字符将用逗号分隔,但示例中没有它们(在它可能出现的地方)。没关系,因为我的程序会忽略逗号。

您可以像这样运行以下程序:

$ ./scriptname inputfile

这是它所有的笨拙之处:

#!/usr/bin/awk -f
BEGIN {
FS = "[.?!]"
chars["n"] = "˜ñ"
chars["N"] = "˜Ñ"
chars["a"] = "´á"
chars["A"] = "´Á"
chars["e"] = "´é"
chars["E"] = "´É"
chars["ı"] = "´í"
chars["I"] = "´Í"
chars["o"] = "´ó"
chars["O"] = "´Ó"
chars["u"] = "´ú"
chars["U"] = "´Ú"
}

/Key Vocabulary/ {exit}

NR == 1 { sub(".*A: *","",$1) }

/^\(.*\) *$/ || \
/^(A|B): *$/ || \
/^ *$/ \
{next}

{
punct = gensub($1"(.)"$2,"\\1","",$0)

for (i=0; i<=length($2); i++) {
char = substr($2,i,1);
if (char != " ") {
sub(substr(chars[char],1,1),substr(chars[char],2,1),$1)
}
}

printf "%s%s;", $1, punct
getline
print
}

关于linux - 如何用同一文本行中的尾随字符替换字符匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3809761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com