Linuxで、次のようなエントリを含むファイルがある場合:
私の番号は=1234です。#これは乱数です
sedまたはその他を使用して、「#」の後のすべてのスペースを「+」に置き換えて、出力が次のようになるようにすることはできますか?
私の番号は=1234です。#This + is + a + random + number
使用する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
あなたは純粋なシェルでこれを行うことができます...
$ 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
1行の入力データのみを処理していると仮定すると、上の行をにパイプすることでそれを取り除くことができると思います。
それほど効率的ではありませんが、次のようになります。
perl -pe '1 while (s/(.*#[^ ]*) /\1+/);'
これはあなたのために働くかもしれません(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
ここにさらに別の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を次でラップします:while (<>) {
@F = split('#');
# code from -e goes here
}