Généralement, les codes publiés dans les pages Web contiennent des numéros de ligne. Lorsque je copie et colle du code dans un éditeur de texte (bien que certains éditeurs de texte suppriment automatiquement les numéros de ligne, mais parfois, cela ne fonctionne pas), il devient fatiguant de supprimer les numéros de ligne.
Il doit exister certains outils d’analyse sed, awk ou linux pour le gérer.
Disons que j'ai le code ci-dessous, comment puis-je supprimer les numéros de ligne en toute sécurité avec les outils mentionnés ci-dessus?
1 /*
2 * Beep using pcm
3 *
4 * Copyright (c) by Takashi Iwai <[email protected]>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #include <asm/io.h>
22 #include <asm/irq.h>
23 #include <linux/init.h>
24 #include <linux/slab.h>
25 #include <linux/input.h>
26 #include <linux/pci.h>
27 #include <linux/dma-mapping.h>
28 #include <sound/core.h>
29 #include <sound/control.h>
30 #include "pmac.h"
31
32 struct pmac_beep {
33 int running; /* boolean */
34 int volume; /* mixer volume: 0-100 */
35 int volume_play; /* currently playing volume */
36 int hz;
37 int nsamples;
38 short *buf; /* allocated wave buffer */
39 dma_addr_t addr; /* physical address of buffer */
40 struct input_dev *dev;
41 };
42
43 /*
44 * stop beep if running
45 */
46 void snd_pmac_beep_stop(struct snd_pmac *chip)
47 {
48 struct pmac_beep *beep = chip->beep;
49 if (beep && beep->running) {
50 beep->running = 0;
51 snd_pmac_beep_dma_stop(chip);
52 }
53 }
54
55 /*
56 * Stuff for outputting a beep. The values range from -327 to +327
57 * so we can multiply by an amplitude in the range 0..100 to get a
58 * signed short value to put in the output buffer.
59 */
60 static short beep_wform[256] = {
61 0, 40, 79, 117, 153, 187, 218, 245,
62 269, 288, 304, 316, 323, 327, 327, 324,
63 318, 310, 299, 288, 275, 262, 249, 236,
64 224, 213, 204, 196, 190, 186, 183, 182,
65 182, 183, 186, 189, 192, 196, 200, 203,
66 206, 208, 209, 209, 209, 207, 204, 201,
67 197, 193, 188, 183, 179, 174, 170, 166,
68 163, 161, 160, 159, 159, 160, 161, 162,
69 164, 166, 168, 169, 171, 171, 171, 170,
70 169, 167, 163, 159, 155, 150, 144, 139,
71 133, 128, 122, 117, 113, 110, 107, 105,
72 103, 103, 103, 103, 104, 104, 105, 105,
73 105, 103, 101, 97, 92, 86, 78, 68,
74 58, 45, 32, 18, 3, -11, -26, -41,
75 -55, -68, -79, -88, -95, -100, -102, -102,
76 -99, -93, -85, -75, -62, -48, -33, -16,
77 0, 16, 33, 48, 62, 75, 85, 93,
78 99, 102, 102, 100, 95, 88, 79, 68,
79 55, 41, 26, 11, -3, -18, -32, -45,
80 -58, -68, -78, -86, -92, -97, -101, -103,
81 -105, -105, -105, -104, -104, -103, -103, -103,
82 -103, -105, -107, -110, -113, -117, -122, -128,
83 -133, -139, -144, -150, -155, -159, -163, -167,
84 -169, -170, -171, -171, -171, -169, -168, -166,
85 -164, -162, -161, -160, -159, -159, -160, -161,
86 -163, -166, -170, -174, -179, -183, -188, -193,
87 -197, -201, -204, -207, -209, -209, -209, -208,
88 -206, -203, -200, -196, -192, -189, -186, -183,
89 -182, -182, -183, -186, -190, -196, -204, -213,
90 -224, -236, -249, -262, -275, -288, -299, -310,
91 -318, -324, -327, -327, -323, -316, -304, -288,
92 -269, -245, -218, -187, -153, -117, -79, -40,
93 };
94
95 #define BEEP_SRATE 22050 /* 22050 Hz sample rate */
96 #define BEEP_BUFLEN 512
97 #define BEEP_VOLUME 15 /* 0 - 100 */
98
99 static int snd_pmac_beep_event(struct input_dev *dev, unsigned int type,
100 unsigned int code, int hz)
101 {
102 struct snd_pmac *chip;
103 struct pmac_beep *beep;
104 unsigned long flags;
105 int beep_speed = 0;
106 int srate;
107 int period, ncycles, nsamples;
108 int i, j, f;
109 short *p;
110
111 if (type != EV_SND)
112 return -1;
113
114 switch (code) {
115 case SND_BELL: if (hz) hz = 1000;
116 case SND_TONE: break;
117 default: return -1;
118 }
119
120 chip = input_get_drvdata(dev);
121 if (! chip || (beep = chip->beep) == NULL)
122 return -1;
123
124 if (! hz) {
125 spin_lock_irqsave(&chip->reg_lock, flags);
126 if (beep->running)
127 snd_pmac_beep_stop(chip);
128 spin_unlock_irqrestore(&chip->reg_lock, flags);
129 return 0;
130 }
131
132 beep_speed = snd_pmac_rate_index(chip, &chip->playback, BEEP_SRATE);
133 srate = chip->freq_table[beep_speed];
134
135 if (hz <= srate / BEEP_BUFLEN || hz > srate / 2)
136 hz = 1000;
137
138 spin_lock_irqsave(&chip->reg_lock, flags);
139 if (chip->playback.running || chip->capture.running || beep->running) {
140 spin_unlock_irqrestore(&chip->reg_lock, flags);
141 return 0;
142 }
143 beep->running = 1;
144 spin_unlock_irqrestore(&chip->reg_lock, flags);
145
146 if (hz == beep->hz && beep->volume == beep->volume_play) {
147 nsamples = beep->nsamples;
148 } else {
149 period = srate * 256 / hz; /* fixed point */
150 ncycles = BEEP_BUFLEN * 256 / period;
151 nsamples = (period * ncycles) >> 8;
152 f = ncycles * 65536 / nsamples;
153 j = 0;
154 p = beep->buf;
155 for (i = 0; i < nsamples; ++i, p += 2) {
156 p[0] = p[1] = beep_wform[j >> 8] * beep->volume;
157 j = (j + f) & 0xffff;
158 }
159 beep->hz = hz;
160 beep->volume_play = beep->volume;
161 beep->nsamples = nsamples;
162 }
163
164 spin_lock_irqsave(&chip->reg_lock, flags);
165 snd_pmac_beep_dma_start(chip, beep->nsamples * 4, beep->addr, beep_speed);
166 spin_unlock_irqrestore(&chip->reg_lock, flags);
167 return 0;
168 }
169
170 /*
171 * beep volume mixer
172 */
173
174 static int snd_pmac_info_beep(struct snd_kcontrol *kcontrol,
175 struct snd_ctl_elem_info *uinfo)
176 {
177 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
178 uinfo->count = 1;
179 uinfo->value.integer.min = 0;
180 uinfo->value.integer.max = 100;
181 return 0;
182 }
183
184 static int snd_pmac_get_beep(struct snd_kcontrol *kcontrol,
185 struct snd_ctl_elem_value *ucontrol)
186 {
187 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
188 if (snd_BUG_ON(!chip->beep))
189 return -ENXIO;
190 ucontrol->value.integer.value[0] = chip->beep->volume;
191 return 0;
192 }
193
194 static int snd_pmac_put_beep(struct snd_kcontrol *kcontrol,
195 struct snd_ctl_elem_value *ucontrol)
196 {
197 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
198 unsigned int oval, nval;
199 if (snd_BUG_ON(!chip->beep))
200 return -ENXIO;
201 oval = chip->beep->volume;
202 nval = ucontrol->value.integer.value[0];
203 if (nval > 100)
204 return -EINVAL;
205 chip->beep->volume = nval;
206 return oval != chip->beep->volume;
207 }
208
209 static struct snd_kcontrol_new snd_pmac_beep_mixer = {
210 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
211 .name = "Beep Playback Volume",
212 .info = snd_pmac_info_beep,
213 .get = snd_pmac_get_beep,
214 .put = snd_pmac_put_beep,
215 };
216
217 /* Initialize beep stuff */
218 int __devinit snd_pmac_attach_beep(struct snd_pmac *chip)
219 {
220 struct pmac_beep *beep;
221 struct input_dev *input_dev;
222 struct snd_kcontrol *beep_ctl;
223 void *dmabuf;
224 int err = -ENOMEM;
225
226 beep = kzalloc(sizeof(*beep), GFP_KERNEL);
227 if (! beep)
228 return -ENOMEM;
229 dmabuf = dma_alloc_coherent(&chip->pdev->dev, BEEP_BUFLEN * 4,
230 &beep->addr, GFP_KERNEL);
231 input_dev = input_allocate_device();
232 if (! dmabuf || ! input_dev)
233 goto fail1;
234
235 /* FIXME: set more better values */
236 input_dev->name = "PowerMac Beep";
237 input_dev->phys = "powermac/beep";
238 input_dev->id.bustype = BUS_ADB;
239 input_dev->id.vendor = 0x001f;
240 input_dev->id.product = 0x0001;
241 input_dev->id.version = 0x0100;
242
243 input_dev->evbit[0] = BIT_MASK(EV_SND);
244 input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);
245 input_dev->event = snd_pmac_beep_event;
246 input_dev->dev.parent = &chip->pdev->dev;
247 input_set_drvdata(input_dev, chip);
248
249 beep->dev = input_dev;
250 beep->buf = dmabuf;
251 beep->volume = BEEP_VOLUME;
252 beep->running = 0;
253
254 beep_ctl = snd_ctl_new1(&snd_pmac_beep_mixer, chip);
255 err = snd_ctl_add(chip->card, beep_ctl);
256 if (err < 0)
257 goto fail1;
258
259 chip->beep = beep;
260
261 err = input_register_device(beep->dev);
262 if (err)
263 goto fail2;
264
265 return 0;
266
267 fail2: snd_ctl_remove(chip->card, beep_ctl);
268 fail1: input_free_device(input_dev);
269 if (dmabuf)
270 dma_free_coherent(&chip->pdev->dev, BEEP_BUFLEN * 4,
271 dmabuf, beep->addr);
272 kfree(beep);
273 return err;
274 }
275
276 void snd_pmac_detach_beep(struct snd_pmac *chip)
277 {
278 if (chip->beep) {
279 input_unregister_device(chip->beep->dev);
280 dma_free_coherent(&chip->pdev->dev, BEEP_BUFLEN * 4,
281 chip->beep->buf, chip->beep->addr);
282 kfree(chip->beep);
283 chip->beep = NULL;
284 }
285 }
286
awk
awk '{$1="";print $0}' FileName > NewFileName
Explication:
awk
divise l'entrée/le fichier en champs, avec un délimiteur par défaut d'espaces.$1=""
signifie "régler le premier champ" sur rien. Le premier champ de votre texte sera toujours le numéro de ligne. Nous supprimons donc essentiellement les numéros de ligne.print $0
signifie "imprimer tous les champs", nous imprimons donc tous les champs, mais le premier champ est maintenant vide et ne sera pas imprimé.awk
gâche le formatage du code. Voir cette réponse pour plus d'informations sur la manière de le conserver.
sed
sed 's/^ *[0-9]\+.//g' FileName > NewFileName
Explication:
sed 's/<replace this>/<with this>/g'
.^ *[0-9]\+.
signifie: correspond au début de la ligne (^
), puis correspond à zéro ou plusieurs espaces (*
), puis correspond à un chiffre compris entre 0 et 9 ([0-9]
), correspond à plus d'un chiffre (\+
), puis à n'importe quel caractère (.
).//
, nous remplaçons donc fondamentalement ce que nous venons de faire correspondre, nous le supprimons effectivement.Crédit à réponse de Karel pour la commande sed
.
cut
(et sed
)sed 's/^ *//g' FileName | cut -d' ' -f2- > NewFileName
Explication:
sed 's/^ *//g'
, où ^ *
signifie: correspond au début de la ligne (^
), puis correspond à zéro ou plusieurs espaces (*
). Nous remplaçons ensuite ce que nous avons jumelé avec rien, pour le supprimer. Cette partie sed
est utilisée pour supprimer tous les espaces de début du fichier.cut
est également un programme de manipulation de texte qui sépare les entrées dans les champs (à l'aide d'un délimiteur par défaut de tab
).-d' '
définit le délimiteur sur un espace. Le premier champ est donc notre nombre.-f2-
signifie que vous imprimez le deuxième champ (le dernier tiret -
signifie "en avant").Depuis le terminal:
sed 's/ *[0-9]*.//' script > script-no-line-numbers
Dans certains éditeurs de texte tels que Geany ou (Notepad ++ uniquement sous Windows), cela peut être fait facilement. Il suffit de maintenir CTRL + ALT, puis de maintenir le clic gauche de la souris et de dessiner un rectangle autour de la zone numérotée.
Si vous voulez une méthode qui fonctionne dans un éditeur de texte, vous pouvez utiliser la combinaison ctrlx + r + k couper une zone rectangulaire de texte dans emacs.