如何从文件中删除特殊符号,例如 &?
How do I remove special symbols such as & from the file?
我一直在尝试使用 tr
实用程序清理我巨大的 xml 文件(> 6gb)。目标是摆脱所有无效字符,并摆脱
、&
、>
等
这是我当前的实现:
cat input.xml | tr -dc '[:print:]' > output.xml
但它只会删除无效字符。您对如何使用 tr
util 实现它有什么建议吗?
在 Notepad++ 中打开文件并使用替换选项。
字符转义是一种仅使用 ASCII 字符表示源代码中字符的方法。在 HTML 中,您可以通过以下方式转义欧元符号 €。
Format Name
€ hexadecimal numeric character reference
€ decimal numeric character reference
€ named character reference
在 CSS 语法中,您将使用以下语法之一。
Format Notes
AC must be followed by a space if the next character is one of a-f, A-F, 0-9
[=11=]20AC must be 6 digits long, no space needed (but can be included)
尾随 space 被视为转义的一部分,因此如果您确实想在转义字符后跟 space,请使用 2 spaces。如果在 CSS 标识符中使用转义符,请参阅下面的附加规则。
因为您应该使用 UTF-8 作为页面的字符编码,所以您通常不需要使用字符转义。但是,您可能会发现它们对于表示不可见或不明确的字符或以其他方式与周围的源代码或文本以不希望的方式交互的字符很有用。
tr
可能行不通
tr
仅用于替换单个字符或字符类。您的示例
、&
和 >
是字符串。我们需要另一个工具。
这是一个 perl
的例子
$ cat input.xml
<xml><tag> hello&, >world!</tag></xml>
$ cat input.xml | perl -p -e 's/&.*?;//g'
<xml><tag>hello, world!</tag></xml>
解释:
perl -p -e 's/&.*?;//g'
perl -------------------- Run a perl program
-p ----------------- Sets up a loop around our program
-e -------------- Use what comes next as a line of our program
's/&.*?;//g' - Our program, which is a perl regular expression.
- Explanation below:
' ------------ Quotes prevent shell expansion/interpolation.
s ----------- Start a string substitution.
/ ---------- Use '/' as the command separator.
& --------- Matches literal ampersand (&),
. -------- followed by any character (.),
* ------- any number of times (*),
?; ----- until the next semicolon (?;).
// --- Replaces the matching text with the characters between the slashes (i.e. nothing at all)
g -- Allows matching the pattern multiple times per line
' - Quotes prevent shell expansion/interpolation
请注意,我假设根据您提供的示例字符串使用 [AMPERSAND(&)、SOMETHING、SEMICOLON(;)] 模式。
您可以扩展该程序以删除无效字符,但我会继续使用 tr
。至少在我的系统上它更快。
所以把它们放在一起你得到
cat input.xml | perl -p -e 's/&.*?;//g' | tr -dc '[:print:]' > output.xml
我一直在尝试使用 tr
实用程序清理我巨大的 xml 文件(> 6gb)。目标是摆脱所有无效字符,并摆脱
、&
、>
等
这是我当前的实现:
cat input.xml | tr -dc '[:print:]' > output.xml
但它只会删除无效字符。您对如何使用 tr
util 实现它有什么建议吗?
在 Notepad++ 中打开文件并使用替换选项。
字符转义是一种仅使用 ASCII 字符表示源代码中字符的方法。在 HTML 中,您可以通过以下方式转义欧元符号 €。
Format Name
€ hexadecimal numeric character reference
€ decimal numeric character reference
€ named character reference
在 CSS 语法中,您将使用以下语法之一。
Format Notes
AC must be followed by a space if the next character is one of a-f, A-F, 0-9
[=11=]20AC must be 6 digits long, no space needed (but can be included)
尾随 space 被视为转义的一部分,因此如果您确实想在转义字符后跟 space,请使用 2 spaces。如果在 CSS 标识符中使用转义符,请参阅下面的附加规则。
因为您应该使用 UTF-8 作为页面的字符编码,所以您通常不需要使用字符转义。但是,您可能会发现它们对于表示不可见或不明确的字符或以其他方式与周围的源代码或文本以不希望的方式交互的字符很有用。
tr
可能行不通
tr
仅用于替换单个字符或字符类。您的示例
、&
和 >
是字符串。我们需要另一个工具。
这是一个 perl
的例子
$ cat input.xml
<xml><tag> hello&, >world!</tag></xml>
$ cat input.xml | perl -p -e 's/&.*?;//g'
<xml><tag>hello, world!</tag></xml>
解释:
perl -p -e 's/&.*?;//g'
perl -------------------- Run a perl program
-p ----------------- Sets up a loop around our program
-e -------------- Use what comes next as a line of our program
's/&.*?;//g' - Our program, which is a perl regular expression.
- Explanation below:
' ------------ Quotes prevent shell expansion/interpolation.
s ----------- Start a string substitution.
/ ---------- Use '/' as the command separator.
& --------- Matches literal ampersand (&),
. -------- followed by any character (.),
* ------- any number of times (*),
?; ----- until the next semicolon (?;).
// --- Replaces the matching text with the characters between the slashes (i.e. nothing at all)
g -- Allows matching the pattern multiple times per line
' - Quotes prevent shell expansion/interpolation
请注意,我假设根据您提供的示例字符串使用 [AMPERSAND(&)、SOMETHING、SEMICOLON(;)] 模式。
您可以扩展该程序以删除无效字符,但我会继续使用 tr
。至少在我的系统上它更快。
所以把它们放在一起你得到
cat input.xml | perl -p -e 's/&.*?;//g' | tr -dc '[:print:]' > output.xml