我是 bash 新手。我想编写一个 bash 脚本,其中有一个文件“file.txt”。
我想将普通字符剪切并粘贴到charecters.txt,将特殊字符剪切并粘贴到special.txt。
伪代码
#!/bin/bash
touch charecters.txt
touch specialcharecters.txt
file='file.txt'
i=1
while read line; do
if
# the letter is a charecter
then
# cp that letter to charecters.txt
else
cp that letter to alphabet.txt
fi
i=$((i+1))
done < $file
如何在 Bash/shell 中执行此操作?
答案1
我假设特殊字符是指非字母数字?如果是这样,这就是我想出的。我有一个名为的文件test
,其中包含:
1234: 2271' 4423'
8901 1234 2569?
1234@ 5678! 9107:
1134 7896 6780
如果我运行cat test | tr -d '[:alnum:]'
我会得到这个输出:
: ' '
?
@ ! :
如果我想匹配字母数字符号,我可以使用这个命令
grep -o '[A-Za-z0-9]*' test
我认为您不需要遍历每一行。
答案2
使用 GNU awk
,您可以执行以下操作:
gawk '
BEGIN {
n = split("alpha digit punct space", class)
RS = ".{1}"; ORS = ""
}
{
for (i = 1; i <= n; i++) if (RT ~ "^[[:" class[i] ":]]$") {
print RT > (class[i] ".txt")
next
}
print RT > "other.txt"
}' < input.txt
根据字符在当前语言环境中被认为属于的类别,将字符排序为alpha.txt
、digit.txt
、punct.txt
、space.txt
、 。other.txt
请注意,尽管有这个名称,该类alpha
不仅仅涉及字母文字中的字符。它通常包括构成人类语言单词的字符,甚至包括那些非字母文字的字符。在 GNU 语言环境中,它还包含多个数字系统的数字(英语 0123456789 除外,它是该类唯一匹配的数字digit
)。在其他一些系统上,digit
包括各种数字(尽管仅来自小数数字系统),而alpha
没有。无论如何,alnum
都是alpha
+ digit
。 C 标准,以及很快 POSIX 也是如此,采用 GNU 的方法。
答案3
为了完整起见,这里有一句话。
cat file.txt | tee >(tr -d -C '[:alpha:]'>char.txt) | tr -d '[:alpha:]'>specialchar.txt
此示例用于tee
将输出复制到两个不同的进程中。
第一个是tr
删除非字母字符(-C 是“补码”或相反),然后将该输出写入文件名。
第二个tr
只是删除字母字符并将其余的发送到另一个文件名。
本质上,这与运行整个过程两次是一样的:
cat filename | filter out nonalphas > char.txt
cat filename | filter out alphas > specialchar.txt
但这是两个单独的命令,并且输入可能已更改。