6

Linuxで、次のようなエントリを含むファイルがある場合:

私の番号は=1234です。#これは乱数です

sedまたはその他を使用して、「#」の後のすべてのスペースを「+」に置き換えて、出力が次のようになるようにすることはできますか?

私の番号は=1234です。#This + is + a + random + number

4

5 に答える 5

3

使用する1つの方法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 に答える
3

あなたは純粋なシェルでこれを行うことができます...

$ 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 -11行の入力データのみを処理していると仮定すると、上の行をにパイプすることでそれを取り除くことができると思います。

于 2012-07-19T01:12:12.350 に答える
2

それほど効率的ではありませんが、次のようになります。

perl -pe '1 while (s/(.*#[^ ]*) /\1+/);'
于 2012-07-19T00:51:21.340 に答える
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 に答える
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文字列を配列に分割する方法を指定します。
  • -anstdinを次でラップします:
while (<>) {
  @F = split('#');
  # code from -e goes here
}
于 2012-07-19T01:55:02.117 に答える