6

在 Linux 中,如果我有一个包含以下条目的文件:

我的号码是 = 1234;#这是一个随机数

我可以使用 sed 或其他任何东西将 '#' 之后的所有空格替换为 '+',以便输出如下所示:

我的号码是 = 1234;#This+is+a+随机+数字

4

5 回答 5

3

你可以在纯shell中做到这一点......

$ foo="My Number is = 1234; #This is a random number"
$ echo -n "${foo%%#*}#"; echo "${foo#*#}" | tr ' ' '+'
My Number is = 1234; #This+is+a+random+number
$ 

将这些数据捕获到变量中以供进一步使用留给读者作为练习。:-)

请注意,这也可以承受行上的多个 # 字符:

$ foo="My Number is = 1234; #This is a # random number"
$ echo -n "${foo%%#*}#"; echo "${foo#*#}" | tr ' ' '+'
My Number is = 1234; #This+is+a+#+random+number
$ 

或者,如果您更愿意创建一个变量而不是通过管道tr

$ echo -n "${foo%%#*}#"; bar="${foo#*#}"; echo "${bar// /+}"
My Number is = 1234; #This+is+a+#+random+number

最后,如果您不介意带有管道的子外壳,您可以这样做:

$ bar=$(echo -n "$foo" | tr '#' '\n' | sed -ne '2,$s/ /+/g;p' | tr '\n' '#')
$ echo "$bar"
My Number is = 1234; #This+is+a+#+random+number
$

为了好玩,这里有一个简短的awk解决方案:

$ echo $foo | awk -vRS=# -vORS=# 'NR>1 {gsub(/ /,"+")} 1'
My Number is = 1234; #This+is+a+#+random+number
#$ 

注意尾随的 ORS。我不知道是否可以避免使用最终记录分隔符。我想你可以通过将上面的行通过管道来摆脱它head -1,假设你只处理一行输入数据。

于 2012-07-19T01:12:12.350 回答
3

一种使用方式awk

awk -F# 'OFS=FS { gsub(" ", "+", $2) }1' file.txt

结果:

My Number is = 1234; #This+is+a+random+number

编辑:

阅读下面的评论后,如果您的文件包含多个#,您可以尝试以下操作:

awk -F# 'OFS=FS { for (i=2; i <= NF; i++) gsub(" ", "+", $i); print }' file.txt
于 2012-07-19T00:48:37.147 回答
2

这可能对您有用(GNU sed):

echo 'My Number is = 1234; #This is a random number' | 
sed 's/#/\n&/;h;s/.*\n//;y/ /+/;H;g;s/\n.*\n//'
My Number is = 1234; #This+is+a+random+number
于 2012-07-19T06:21:19.633 回答
2

效率不高,但是:

perl -pe '1 while (s/(.*#[^ ]*) /\1+/);'
于 2012-07-19T00:51:21.340 回答
1

这是另一个perl单线:

echo 'My Number is = 1234; #This is a random number' \
| perl -F\# -lane 'join "#", @F[1,-1]; s/ /+/g; print $F[1], "#", $_'
  • -F指定如何将字符串拆分为@F数组。
  • -an用以下方式包装标准输入:
while (<>) {
  @F = split('#');
  # code from -e goes here
}
于 2012-07-19T01:55:02.117 回答