乐闻世界logo
搜索文章和话题

How to remove all non-numeric characters from a string in Bash?

1个答案

1

Removing all non-digit characters from a string in Bash can be achieved through multiple methods, with sed and tr being the most commonly used. Below are detailed steps and examples for two primary approaches:

Method 1: Using the sed Command

sed is a powerful text processing utility that filters and replaces data. To remove all non-digit characters, leverage its substitution feature. The command is:

bash
echo "abc123def456" | sed 's/[^0-9]*//g'

Here's the explanation:

  • echo "abc123def456": Outputs the test string.
  • |: Pipe operator, forwarding the previous command's output to the next.
  • sed 's/[^0-9]*//g': sed's substitution feature. Here, s denotes substitution, [^0-9]* matches all non-digit characters via a regular expression, // replaces matches with empty strings, and g enables global replacement.

The output will be:

shell
123456

Method 2: Using the tr Command

The tr command handles character replacement or deletion. To remove all non-digit characters, use:

bash
echo "abc123def456" | tr -cd '0-9'

Here's the explanation:

  • echo "abc123def456": Outputs the test string.
  • |: Pipe operator.
  • tr -cd '0-9': tr's character deletion feature. -c specifies the complement (selecting characters outside the specified set), -d indicates deletion, and '0-9' defines the digit character set.

The output will be:

shell
123456

Both methods effectively remove all non-digit characters. In practice, select based on specific requirements and familiarity with command-line tools. For Bash string processing, you can also use native string replacement or external tools like sed or tr. Below are additional common approaches:

Method 1: Using Bash's Native Parameter Substitution

Bash offers a straightforward string replacement feature for removing non-digit characters. This method avoids external tools and provides higher execution efficiency.

bash
str="user123abc456" cleaned_str=${str//[^0-9]/} echo $cleaned_str # Output: 123456

Here, ${str//[^0-9]/} is a parameter substitution expression that replaces all characters in str not in [0-9] with empty strings.

Method 2: Using sed

sed is a robust stream editor for text transformations. Here, it removes non-digit characters:

bash
str="user123abc456" cleaned_str=$(echo $str | sed 's/[^0-9]//g') echo $cleaned_str # Output: 123456

The command sed 's/[^0-9]//g' replaces all non-digit characters with empty strings, where g denotes global replacement.

Method 3: Using tr

tr is a simple character transformation tool for deleting or replacing characters.

bash
str="user123abc456" cleaned_str=$(echo $str | tr -cd '0-9') echo $cleaned_str # Output: 123456

In this command, tr -cd '0-9' deletes all input characters not in '0-9' (where -c specifies the complement, selecting characters outside the listed set).

Summary

For removing non-digit characters, choose between Bash's built-in string processing or tools like sed or tr. The decision depends on personal preference, tool availability, and performance needs. In simple scenarios, native Bash replacement suffices, but for complex text processing, sed or tr may be more suitable.

2024年6月29日 12:07 回复

你的答案