在Linux中,如果我有一个包含以下条目的文件:
我的号码是= 1234; #这是一个随机数
我可以使用sed或其他任何东西将'#'替换为'+'之后的所有空格,以便输出如下所示:
我的号码是= 1234; #这+是一个+ + +随机数
答案 0 :(得分: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
答案 1 :(得分: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
上面的行来摆脱它。
答案 2 :(得分:2)
效率不高,但是:
perl -pe '1 while (s/(.*#[^ ]*) /\1+/);'
答案 3 :(得分: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
答案 4 :(得分: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
用stdin包装stdin:while (<>) {
@F = split('#');
# code from -e goes here
}