SED 用于替换字符串之间的破折号

SED for replacing dash between strings

我想更换:

S-digit-digit-digit-digit-digit-digit-digit

来自

S_digit_digit_digit_digit_digit_digit_digit 

例子如下:

S-1-5-21-1119404543-3273515248-2536353511-2784
S_1_5_21_1119404543_3273515248_2536353511_2784

我试过了:

sed -e 's/[[.]]-[[:digit:]]-[[:digit:]]-[[:digit:]]-[[:digit:]]-[[:digit:]]-[[:digit:]]-[[:digit:]]/s/[[.]]_[[:digit:]]_[[:digit:]]_[[:digit:]]_[[:digit:]]_[[:digit:]]_[[:digit:]]_[[:digit:]]/g'
  1. [[:digit:]] 匹配单个数字。 [:digit:] 是一个字符 class。 sed manual character classes
  2. [[.]] 只是无效的。没有 [.] "character class" 和 [ 如果 [...] 必须是最后一个字符,而 [...] 必须是第一个字符 ]。如果你想匹配单个任意字符,只需做一个点 .。我推荐regex crosswords to learn regular expressions.
  3. 我相信你只是想匹配表达式,用 backreferences and replace the dashes. Here is a great sed tutorial.
  4. 保存 numbers

所以:

$ sed 's/\(.\)-\([[:digit:]]*\)-\([[:digit:]]*\)-\([[:digit:]]*\)-\([[:digit:]]*\)-\([[:digit:]]*\)-\([[:digit:]]*\)-\([[:digit:]]*\)/______/g' <<<'S-1-5-21-1119404543-3273515248-2536353511-2784'
S_1_5_21_1119404543_3273515248_2536353511

您也可以保留该行,使用一些分隔符提取您希望所有破折号替换为下划线的相关部分,然后替换所有破折号并抓住该行并与输出的原始输入随机播放:

$ sed 's/.\(-[^-]*\)\{7\}/\n&\n/;h;s/-/_/g;G;s/.*\n\(.*\)\n.*\n\(.*\)\n.*\n//' <<<'unrelated text S-1-5-21-1119404543-3273515248-2536353511-2784 unrelated text'
unrelated text S_1_5_21_1119404543_3273515248_2536353511_2784 unrelated text