假设我有一个字符串
name = xyz
在名称之后有一个制表符,在“=”之后有随机数量的空格。
我需要一个输出
name=xyz
那么如何使用 sed 或 awk 和 tcl regsub 函数从上述字符串中删除制表符和随机数量的空格。 非常感谢您的帮助。谢谢。
我试过了
[regsub -all { +} $str ""]
这从
$str
中删除了随机数量的空格,但制表符仍然存在。
\s
匹配制表符和空格。那么请你试试:
[regsub -all {\s+} $str ""]
这里的潜在问题是它会删除任何地方的空白字符,而不管与
=
符号的相关性。
这样说会更安全:
[regsub {\t=\s*} $str "="]
删除
=
之前的制表符和=
之后的空格。
这也是使用
sed
的解决方案
myvar=$(sed -E 's/\s*=\s*/=/g' <<<$myvar)
或者,为了更便携,您可以使用
[[:space:]]
而不是 \s
myvar=$(sed -E 's/[[:space:]]*=[[:space:]]*/=/g' <<<$myvar)
在这里每次被任意数量的空格符号包围的
=
的出现将被替换为=
,没有任何空格。
使用
bash
参数替换:
$ str='name = xyz'
$ str="${str//[ \t]/}"
$ echo "$str"
name=xyz
# or
$ str='name = xyz'
$ str="${str//[[:space:]]/}"
$ echo "$str"
name=xyz
我会按照以下方式利用 GNU
AWK
完成这项任务
echo "name = xyz" | awk 'BEGIN{OFS=""}{$1=$1;print}'
给出输出
name=xyz
说明:GNU
AWK
假设字段分隔符是一个或多个符合您的用例的空白字符,我将 OFS
设置为空字符串,因此字段之间没有任何内容,$1=$1
触发字符串重建, print
确实打印出来了。如果您想了解更多有关OFS
的信息,请阅读8个强大的Awk内置变量——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR
(在 GNU Awk 5.0.1 中测试)