编写一个 Bash 脚本,将文本文件作为输入并通过多个命令传输文本文件
Writing a Bash script that takes a text file as input and pipes the text file through several commands
我将带有定义的文本文件保存在一个文件夹中。我喜欢将它们转换成口语,这样我就可以听它们了。我已经通过 运行 一些命令手动执行此操作,将一些预处理代码插入文本文件,然后将文本转换为口语,如下所示:
sed 's/\..*$/[[slnc 2000]]/' input.txt
在第一个句点后插入一个控制代码
sed 's/$/[[slnc 2000]]/' input.txt"
在每行末尾插入一个控制代码
cat input.txt | say -v Alex -o input.aiff
我不想每次都重新输入这些命令,而是想创建一个 Bash 脚本,将这些命令的输出通过管道传输到最终产品。我想用脚本名称调用脚本,后跟文本文件的输入文件参数。我想保留原始文本文件,这样如果我再次打开它,实际上会插入 none 个控制代码,因为控制代码的唯一目的是在音频文件中插入暂停。
我试过写
#!/bin/bash
FILE=
sed 's/$/ [[slnc 2000]]/' FILE -o FILE
但是我马上就挂断了,因为它说 sed: -o: 没有那个文件或目录。有人可以帮忙吗?
这将:-
a} 使用 find 在当前目录中列出要处理的文本文件。
b} 将您的 sed 命令应用于列表中的每个文本文件,但仅供当前使用,以便您完整地保存它们。
c} 用编辑后的文件调用“say”。
我没有发言权,所以我无法测试那个或控制代码;但只要你有 Ed,循环就会起作用。我已经用过很多次了。我是在接触 FORTH 之后才学会它的,FORTH 是一种仍然允许未终止循环的语言。我曾经有过记住在脚本末尾调用 next 以启动它的问题,但我通过首先以 FORTH 风格定义我的词(函数),然后总是将我的一次性命令放在结束。
#!/bin/sh
next() {
[[ -s stack ]] && main
end
}
main() {
line=$(ed -s stack < edprint+.txt)
infile=$(cat "${line}" | sed 's/\..*$/[[slnc 2000]]/' | sed 's/$/[[slnc 2000]]/')
say "${infile}" -v Alex -o input.aiff
ed -s stack < edpop+.txt
next
}
end() {
rm -v ./stack
rm -v ./edprint+.txt
rm -v ./edpop+.txt
exit 0
}
find *.txt -type -f > stack
cat >> edprint+.txt << EOF
1
q
EOF
cat >> edpop+.txt << EOF
1d
wq
EOF
next
如果你只想使用foo.txt生成带控制字符的foo.aiff,你可以这样做:
#!/bin/sh
for file; do
test "${file%.txt}" = "${file}" && continue
sed -e 's/\..*$/[[slnc 2000]]/' "$file" |
sed -e 's/$/[[slnc 2000]]/' |
say -v Alex -o "${file%.txt}".aiff
done
使用您的 .txt 文件作为参数调用脚本(例如,./myscript *.txt
),它将生成 .aiff
文件。请注意,如果 say
覆盖文件,那么这也会。你真的不需要两次 sed
调用,你正在调用的 sed 可以被清理,但我不想分散对这里核心问题的注意力,所以我将按照你的方式离开它。
我将带有定义的文本文件保存在一个文件夹中。我喜欢将它们转换成口语,这样我就可以听它们了。我已经通过 运行 一些命令手动执行此操作,将一些预处理代码插入文本文件,然后将文本转换为口语,如下所示:
sed 's/\..*$/[[slnc 2000]]/' input.txt
在第一个句点后插入一个控制代码
sed 's/$/[[slnc 2000]]/' input.txt"
在每行末尾插入一个控制代码
cat input.txt | say -v Alex -o input.aiff
我不想每次都重新输入这些命令,而是想创建一个 Bash 脚本,将这些命令的输出通过管道传输到最终产品。我想用脚本名称调用脚本,后跟文本文件的输入文件参数。我想保留原始文本文件,这样如果我再次打开它,实际上会插入 none 个控制代码,因为控制代码的唯一目的是在音频文件中插入暂停。
我试过写
#!/bin/bash
FILE=
sed 's/$/ [[slnc 2000]]/' FILE -o FILE
但是我马上就挂断了,因为它说 sed: -o: 没有那个文件或目录。有人可以帮忙吗?
这将:-
a} 使用 find 在当前目录中列出要处理的文本文件。
b} 将您的 sed 命令应用于列表中的每个文本文件,但仅供当前使用,以便您完整地保存它们。
c} 用编辑后的文件调用“say”。
我没有发言权,所以我无法测试那个或控制代码;但只要你有 Ed,循环就会起作用。我已经用过很多次了。我是在接触 FORTH 之后才学会它的,FORTH 是一种仍然允许未终止循环的语言。我曾经有过记住在脚本末尾调用 next 以启动它的问题,但我通过首先以 FORTH 风格定义我的词(函数),然后总是将我的一次性命令放在结束。
#!/bin/sh
next() {
[[ -s stack ]] && main
end
}
main() {
line=$(ed -s stack < edprint+.txt)
infile=$(cat "${line}" | sed 's/\..*$/[[slnc 2000]]/' | sed 's/$/[[slnc 2000]]/')
say "${infile}" -v Alex -o input.aiff
ed -s stack < edpop+.txt
next
}
end() {
rm -v ./stack
rm -v ./edprint+.txt
rm -v ./edpop+.txt
exit 0
}
find *.txt -type -f > stack
cat >> edprint+.txt << EOF
1
q
EOF
cat >> edpop+.txt << EOF
1d
wq
EOF
next
如果你只想使用foo.txt生成带控制字符的foo.aiff,你可以这样做:
#!/bin/sh
for file; do
test "${file%.txt}" = "${file}" && continue
sed -e 's/\..*$/[[slnc 2000]]/' "$file" |
sed -e 's/$/[[slnc 2000]]/' |
say -v Alex -o "${file%.txt}".aiff
done
使用您的 .txt 文件作为参数调用脚本(例如,./myscript *.txt
),它将生成 .aiff
文件。请注意,如果 say
覆盖文件,那么这也会。你真的不需要两次 sed
调用,你正在调用的 sed 可以被清理,但我不想分散对这里核心问题的注意力,所以我将按照你的方式离开它。