我想编写一个 bash 脚本来将字符与特殊字符分开?

我想编写一个 bash 脚本来将字符与特殊字符分开?

我是 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.txtdigit.txtpunct.txtspace.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

但这是两个单独的命令,并且输入可能已更改。

相关内容