使用以下脚本,我尝试读取文本文件(italian.txt),并从此文件中将所有单词从意大利语翻译成英语,并将输出保存在另一个文本文件(english.txt)中。我必须将sed
命令与全局命令一起使用g
,以便翻译该单词的每个外观。
它工作不正常,但我不知道出了什么问题。有人可以帮助我吗?
cat italian.txt | sed -i 's/sole/sun/g' | 's/penna/pen/g' > english.txt
exit 0
答案1
您的脚本存在几个问题:
- 您需要
sed
在第二个管道 (|
) 之后添加第二个管道。 sed -i
告诉sed
“就地”编辑文件,但没有指定文件 -sed
正在使用stdin
,来自cat
.您可以安全地删除它-i
,您的脚本现在应该可以工作了。
固定脚本应该是:
cat italian.txt | sed 's/sole/sun/g' | sed 's/penna/pen/g' > english.txt
答案2
你用错了。
首先,你不需要猫。sed
可以读取文件名。像这样:
sed 's/sole/sun/g' italian.txt
其次,您不需要为 nextsed
表达式进行管道重定向。如果你需要它,它应该看起来像这样:
sed 's/sole/sun/g' italian.txt | sed 's/penna/pen/g' > english.txt
,但这是额外的工作。sed
可以处理多个表达式。您可以通过 «;» 将它们分开或者将它们sed
作为命令行参数添加到-e
每个参数之前。
总之,命令看起来像这样:
sed 's/sole/sun/g; s/penna/pen/g' italian.txt > english.txt
答案3
例如,如果您有一个包含单词对的文件
sole sun
penna pen
...等等对于意大利语和英语中的许多单词(除了记忆之外没有实际限制),那么您可以创建一个sed
脚本
s/\<sole\>/sun/g
s/\<penna\>/pen/g
...(\<word\>
其中仅匹配单词word
而不匹配例如words
or reword
),如下所示:
$ awk '{ printf("s/\\<%s\\>/%s/g\n", $1, $2) }' pairs.txt >translate.sed
然后您可以将该sed
脚本应用于文本文件:
$ sed -f translate.sed italian.txt >english.txt
答案4
@Kusalanananda 想法的一个变体:
$ cat dict
sole:sun
penna:pen
$ sed -f <(sed -r 's!(.+):(.+)!s/\\<\1\\>/\2/g!' dict) it.txt >en.txt