1

実行中の手動データ入力の大部分を有利に進めるために、いくつかの XML フィールドにデータを入力しようとしています。

正規表現と2つのフラットファイルを使用して、テキストを次のように変換しようとしています:

EA10A3

これに:

<nodevice id="EA10A3" seq=" " />

sedで何が起こっているかは次のとおりです。

~/Tickets/RWSP-11422 > cat locations.txt
EA10A1
EA10A2
EA10A3

~/Tickets/RWSP-11422 > cat platform
  <nodevice id="PPPPPP" seq=" " />

~/Tickets/RWSP-11422 > while read i; do cat platform | sed "s/PPPPPP/$i/g"; done <locations.txt
" seq=" " />ice id="EA10A1
" seq=" " />ice id="EA10A2
" seq=" " />ice id="EA10A3

Perl でも同じことが言えます:

~/Tickets/RWSP-11422 > while read i; do cat platform | perl -wpl -e "s/PPPPPP/$i/g"; done < locations.txt
" seq=" " />ice id="EA10A1
" seq=" " />ice id="EA10A2
" seq=" " />ice id="EA10A3

なぜ私は得ているのですか

" seq=" " />ice id="EA10A1 

それ以外の

<nodevice id="EA10A1" seq=" " />

?

そして、どうすればこれを機能させることができますか?

4

3 に答える 3

7

あなたは得ています

<nodevice id="EA10A1^M" seq=" " />

入力ファイルに含まれているため

EA10A1^M^J

入力ファイルを (eg) で修正しますdos2unix

( ^Mはキャリッジ リターンを表し、 ^Jはライン フィードを表します。)

于 2013-09-20T15:27:52.723 に答える
3

UNIX の行末 ( ) ではなく、locations.txtDOS の行末 ( )のように見えます。キャリッジ リターンが出力されると、カーソルが行の先頭に移動し、出力がごちゃごちゃになります。\r\n\n\r

cat -vこれは、キャリッジ リターンを として出力する で確認できます^M

$ cat -v locations.txt
EA10A1^M
EA10A2^M
EA10A3^M
$ while read i; do cat platform | sed "s/PPPPPP/$i/g"; done < locations.txt | cat -v
  <nodevice id="EA10A1^M" seq=" " />
  <nodevice id="EA10A2^M" seq=" " />
  <nodevice id="EA10A3^M" seq=" " />

実行locations.txtするdos2unixfromdos、修正します。

$ dos2unix locations.txt
dos2unix: converting file blah.txt to Unix format ...
$ cat -v locations.txt
EA10A1
EA10A2
EA10A3
$ while read i; do cat platform | sed "s/PPPPPP/$i/g"; done < locations.txt | cat -v
  <nodevice id="EA10A1" seq=" " />
  <nodevice id="EA10A2" seq=" " />
  <nodevice id="EA10A3" seq=" " />
于 2013-09-20T15:28:15.023 に答える
2

dos2unix私にとっては問題のようです。実行してみてください

 dos2unix locations.txt
 perl -ne 'chomp ; printf ("<nodevice id=\"$_\" seq=\" \" / > \n");' locations.txt
于 2013-09-20T15:30:22.600 に答える