Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用sed删除字符串中不同字符之间的空格?_Regex_String_Sed - Fatal编程技术网

Regex 如何使用sed删除字符串中不同字符之间的空格?

Regex 如何使用sed删除字符串中不同字符之间的空格?,regex,string,sed,Regex,String,Sed,我想去掉两个完全不同的字符之间的空格 比如说 在字符串“hello world doddy”中,我希望删除hello和world之间的空格(但保留world和doddy之间的空格,因为需要保留d模式) 我试过: $ echo "hello world doddy" | sed 's/\(.\) \([^\1]\)/\1\2/g' 但最终以 helloworlddoddy不能在字符类中使用backref 我将通过使用哨兵来处理那些应该保留空间的情况,例如: echo "hello world d

我想去掉两个完全不同的字符之间的空格

比如说

在字符串“hello world doddy”中,我希望删除hello和world之间的空格(但保留world和doddy之间的空格,因为需要保留d模式)

我试过:

$ echo "hello world doddy" | sed 's/\(.\) \([^\1]\)/\1\2/g'
但最终以


helloworlddoddy

不能在字符类中使用backref

我将通过使用哨兵来处理那些应该保留空间的情况,例如:

echo "hello world doddy" |
sed 's/\([^ ]\) \1/\1<<>>\1/g;s/\([^ ]\) \([^ ]\)/\1\2/g;s/<<>>/ /g'
echo“hello world doddy”|
sed的/\([^]\)\1/\1\1/g;s/\([^]\)\([^]\)/\1\2/g;s///g'

编辑:将
更改为
[^]
以避免管理双空格,更准确地说。谢谢您的建议。

您不能在字符类中使用backref

我将通过使用哨兵来处理那些应该保留空间的情况,例如:

echo "hello world doddy" |
sed 's/\([^ ]\) \1/\1<<>>\1/g;s/\([^ ]\) \([^ ]\)/\1\2/g;s/<<>>/ /g'
echo“hello world doddy”|
sed的/\([^]\)\1/\1\1/g;s/\([^]\)\([^]\)/\1\2/g;s///g'

编辑:将
更改为
[^]
以避免管理双空格,更准确地说。感谢您的建议。

首先将两个相同字符之间的空格加倍,以准备字符串。中间的空格从两个相同的字符之间移动到其中一个字符和一个空格之间,因此可以用相同的方式检查所有空格

echo "hello world doddy" | sed -e 's/\(.\) \1/\1  \1/g' -e 's/\(.\) \(.\)/\1\2/g'

通过首先将两个相同字符之间的任何空格加倍来准备字符串。中间的空格从两个相同的字符之间移动到其中一个字符和一个空格之间,因此可以用相同的方式检查所有空格

echo "hello world doddy" | sed -e 's/\(.\) \1/\1  \1/g' -e 's/\(.\) \(.\)/\1\2/g'

你赢了我。当我得到更多的选票时,我会投你一票。我会用
[^]
替换
,以确保括号中的字符不是空格。你比我快。当我得到更多的选票时,我会投你一票。我将用
[^]
替换
,以确保括号中的字符不是空格。反引用不会在方括号中展开。这在Perl中更容易解决,您可以根据需要使用lookahead等。这在Perl中更容易解决,您可以根据需要使用lookaheads等。是的,这非常酷!我最终使用了@tripleee关于使用sentinel值的建议——但这很酷。谢谢@在GNU sed中有扩展的potong,它可以按照您的建议缩短。我会在答案中留下更一般的形式,但这对GNU用户来说是一个很好的提示。也许
s/\([^]\)/\1/g
就足够了?是的,这很酷!我最终使用了@tripleee关于使用sentinel值的建议——但这很酷。谢谢@在GNU sed中有扩展的potong,它可以按照您的建议缩短。我会在答案中留下更一般的形式,但这对GNU用户来说是一个很好的提示。也许
s/\([^]\)/\1/g
就足够了?