लाइन के यूनिक्स अंत में विंडोज के छोर को कैसे बदलें (CR / LF से LF)


80

मैं एक जावा डेवलपर हूं और मैं उबंटू का उपयोग कर रहा हूं। प्रोजेक्ट को ग्रहण के साथ विंडोज में बनाया गया था और यह विंडोज -1252 एन्कोडिंग का उपयोग कर रहा है ।

UTF-8 में बदलने के लिए मैंने रिकोड प्रोग्राम का उपयोग किया है :

find Web -iname \*.java | xargs recode CP1252...UTF-8

यह आदेश यह त्रुटि देता है:

recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.java failed: Ambiguous output in step `CR-LF..data

मैंने इसके बारे में खोज की है और बैश और विंडोज, रिकोड में समाधान प्राप्त करें : चरण `डेटा..सीआर-एलएफ 'में अस्पष्ट आउटपुट और यह कहता है:

CR / LF से सिंगल LF में लाइन एंडिंग कन्वर्ट करें: फाइल को Vim से एडिट करें, कमांड दें :set ff=unixऔर फाइल को सेव करें। रिकोड अब त्रुटियों के बिना चलना चाहिए।

अच्छा है, लेकिन मेरे पास सीआर / एलएफ चरित्र को हटाने के लिए कई फाइलें हैं, और मैं इसे करने के लिए प्रत्येक को नहीं खोल सकता। Vi बैश ऑपरेशन के लिए कमांड लाइन के लिए कोई विकल्प प्रदान नहीं करता है।

क्या ऐसा करने के लिए sed का उपयोग किया जा सकता है? कैसे?


recodeमिश्रित डॉस ( \r\n- CRLF) और यूनिक्स ( \nLF) न्यूलाइन कोडिंग के साथ एक फ़ाइल को फिर से बनाने की कोशिश करते समय यह त्रुटि पैदा करता है । Unfortunatelly fromdos, पूर्व में एक द्विआधारी, वर्तमान में पुनरावृत्ति करने के लिए एक उपनाम है जिसमें यह समस्या है।
TMS

आप नहीं कर सकते हैंvim +ex_command_one +ex_command_two ... file
derekdreery

अचरज है! awkजवाब में कोई हल नहीं है।
जेरोल्ड ब्रोसर

जवाबों:


122

एक कार्यक्रम होना चाहिए, जो dos2unixआपके लिए लाइन अंत को ठीक करेगा। यदि यह पहले से आपके लिनक्स बॉक्स पर नहीं है, तो यह पैकेज मैनेजर के माध्यम से उपलब्ध होना चाहिए।


2
मैं tofrodos स्थापित किया है जो fromdos कमांड प्रदान करता है, लेकिन समस्या बनी रहती है। fromdos -a GravacaoMessageHelper.java; recode CP1252 ... UTF-8 GravacaoMessageHelper.java रिटर्न: recode: GravacaoMessageHelper.java विफल: 'CR-LF..data
MaikoID

1
@MaikoID: फिर आपको बड़ी समस्याएं हैं। वैसे भी, लाइन अंत के बारे में ध्यान नहीं देना चाहिए, क्योंकि CR एक और चरित्र है। और यह मेरी मशीन पर ध्यान नहीं देता है।
cHao

1
fromdosसिर्फ एक उपनाम है recode, और जो मिश्रित डॉस (\ r \ n - CRLF) और यूनिक्स (\ n LF) कोडिंग के साथ फ़ाइलों पर उल्लिखित त्रुटि ओपी का उत्पादन करेगा। केवल dos2unixसार्वभौमिक रूप से काम करता है।
टीएमएस

1
dos2unix होमब्रेव के माध्यम से OS X पर उपलब्ध है: "काढ़ा स्थापित करें dos2unix"
जोसेफ

1
बस इस पर चलने के लिए, मैं उसी समस्या में भाग गया और निम्नलिखित का उपयोग करके समाप्त हुआ find ./ -name "*.java" -exec dos2unix {} +:।
amrcel

85

sed \ n से मेल नहीं खा सकता क्योंकि लाइन में पैटर्न स्पेस में डालने से पहले ट्रेलिंग न्यूलाइन को हटा दिया जाता है, लेकिन \ r से मैच कर सकता है, इसलिए आप \ r (nix) से \ r (\ n) को हटाकर \ r को कनवर्ट कर सकते हैं

sed -i 's/\r//g' file

चेतावनी: यह मूल फ़ाइल को बदल देगा

हालाँकि, आप इसके द्वारा यूआईसी ईओएल से डॉस या पुराने मैक (\ r) में नहीं बदल सकते। यहाँ और अधिक रीडिंग:

मैं sed का उपयोग करके एक नई पंक्ति (\ n) को कैसे बदल सकता हूं?


4
+1 यह एक अच्छा उपाय है! लेकिन आपको ध्यान देना चाहिए कि sed -iमूल फ़ाइल बदल जाएगी ! क्योंकि लोग ऐसा sedव्यवहार करने की उम्मीद नहीं करेंगे , इसलिए यहां चेतावनी उचित है। बहुत से लोग नहीं जानते -iकि वे कोशिश करेंगे sed -i ... file > file2और मूल फ़ाइल को संशोधित करने की उम्मीद नहीं करेंगे ।
TMS

सभी sedसंस्करण गैर-प्रतीकात्मक प्रतीकात्मक अनुक्रम को नहीं पहचानते हैं \r। उस मामले में एक शाब्दिक ctrl-M वर्ण के साथ प्रयास करें (कई गोले में, शाब्दिक नियंत्रण वर्ण का उत्पादन करने के लिए ctrl-V ctrl-M टाइप करें)।
ट्रिपल

14

वास्तव में, विम आपको वह चीज़ देता है जिसकी आपको तलाश है। विम दर्ज करें, और निम्न कमांड टाइप करें:

:args **/*.java
:argdo set ff=unix | update | next

इनमें से पहला कमांड तर्क सूची को हर फ़ाइल के मिलान के लिए सेट करता है **/*.java, जो सभी जावा फाइलें, पुनरावर्ती है। इन आदेशों में से दूसरा, तर्क सूची में प्रत्येक फ़ाइल के बदले में निम्न कार्य करता है:

  • यूनिक्स शैली के लिए लाइन-एंडिंग सेट करता है (आप पहले से ही यह जानते हैं)
  • अगर यह बदल दिया गया है, तो फ़ाइल को लिखता है
  • अगली फ़ाइल के लिए आगे बढ़ता है

यह संभवतः dos2unixफॉर-लूप में उपयोग करने की तुलना में बहुत धीमा है , लेकिन यह जानना अभी भी अच्छा है कि इसे विम में कैसे किया जाए!
jpaugh

2
मैं :: दिल :: मेरी विम। इसके लिए शुक्रिया।
जोनो

9

Tr कमांड यह भी कर सकती है:

tr -d '\15\32' < winfile.txt > unixfile.txt

और आपके लिए उपलब्ध होना चाहिए।

आपको स्क्रिप्ट के भीतर से tr चलाने की आवश्यकता होगी, क्योंकि यह फ़ाइल नामों के साथ काम नहीं कर सकता है। उदाहरण के लिए, एक फ़ाइल myscript.sh बनाएँ:

#!/bin/bash

for f in `find -iname \*.java`; do
    echo "$f"
    tr -d '\15\32' < "$f" > "$f.tr"
    mv "$f.tr" "$f"
    recode CP1252...UTF-8 "$f"
done

myscript.shचालू निर्देशिका और उसके उपनिर्देशिकाओं में सभी जावा फ़ाइलों को चलाने की प्रक्रिया होगी।


मैं वेब -नेम * .java खोजने के लिए कैसे अनुकूल हो सकता हूं xargs ने CP1252 ... UTF-8
MaikoID

आपको bash स्क्रिप्ट के भीतर tr चलाना होगा, क्योंकि यह फ़ाइल नामों पर काम नहीं कर सकता है। मैं एक नमूना स्क्रिप्ट के साथ अपना उत्तर संपादित करूंगा।
कीथल L

उत्तर के लिए Thnx लेकिन त्रुटि बनी रहती है = | चरण `CR-LF..data 'में अस्पष्ट उत्पादन
MaikoID

7

मैं jichao के उत्तर के लिए थोड़ा अपवाद लूंगा। आप वास्तव में वह सब कुछ कर सकते हैं जिसके बारे में उन्होंने काफी आसानी से बात की थी। ए की तलाश के बजाय \n, बस लाइन के अंत में गाड़ी वापसी की तलाश करें।

sed -i 's/\r$//' "${FILE_NAME}"

यूनिक्स बैक से डॉस में बदलने के लिए, बस लाइन के अंतिम वर्ण को देखें और उसमें एक फॉर्म फीड जोड़ें। (मैं इसे -rgrep नियमित अभिव्यक्तियों के साथ आसान बनाना चाहूंगा ।)

sed -ri 's/(.)$/\1\r/' "${FILE_NAME}"

सैद्धांतिक रूप से, फ़ाइल को अंतिम शैली में कोड जोड़कर मैक शैली में बदला जा सकता है जो इनपुट की अगली पंक्ति को पहली पंक्ति में जोड़ देता है जब तक कि सभी लाइनों को संसाधित नहीं किया गया हो। मैं उस उदाहरण को यहाँ बनाने की कोशिश नहीं करूँगा, हालाँकि।

चेतावनी: -मैं वास्तविक फ़ाइल बदलता है। यदि आप बैकअप बनाना चाहते हैं, तो वर्णों की एक स्ट्रिंग जोड़ें -i। यह मौजूदा फ़ाइल को उसी फ़ाइल के साथ एक फ़ाइल में ले जाएगा, जिसके अंत में आपके वर्ण जोड़े गए हैं।


1
मुझे आपका सुझाव पसंद है, लेकिन इसका सिर्फ एक समापन एकल उद्धरण याद आ रहा है। यह होना चाहिए: sed -ri's / (।) $ / \ 1 \ r / '$ {FILE_NAME}
mgouin

1
@mgouin ध्यान देने के लिए धन्यवाद। मैंने लापता एकल उद्धरण जोड़ा है।
जॉन चेशिर

1
LF को CRLF में परिवर्तित करने के लिए, लाइन के पूर्ववर्ती अंतिम छोर पर कब्जा करने की आवश्यकता नहीं है और प्रदर्शन पर भी प्रभाव पड़ सकता है। मेरे मामले में यह करने के लिए पर्याप्त है sed -i 's/$/\r/' ${FILE_NAME}...
थॉमस अर्बन

-rविकल्प पोर्टेबल नहीं है, अगर आपके sedपास यह नहीं है, तो शायद कोशिश करें -E
ट्रिपल

5

दूर करने के लिए

Ambiguous output in step `CR-LF..data'

-fरूपांतरण को लागू करने के लिए ध्वज को जोड़ने के लिए बस समाधान हो सकता है ।


0

क्या आपने ब्रायन मौपिन द्वारा यहां पाई गई स्क्रिप्ट की कोशिश की ? (मैंने इसे और अधिक सामान्य होने के लिए थोड़ा संशोधित किया है)

#!/usr/bin/env python

import sys

input_file_name = sys.argv[1]
output_file_name = sys.argv[2]

input_file = open(input_file_name)
output_file = open(output_file_name, 'w')

line_number = 0

for input_line in input_file:
    line_number += 1
    try:  # first try to decode it using cp1252 (Windows, Western Europe)
        output_line = input_line.decode('cp1252').encode('utf8')
    except UnicodeDecodeError, error:  # if there's an error
        sys.stderr.write('ERROR (line %s):\t%s\n' % (line_number, error))  # write to stderr
        try:  # then if that fails, try to decode using latin1 (ISO 8859-1)         
            output_line = input_line.decode('latin1').encode('utf8')
        except UnicodeDecodeError, error:  # if there's an error
            sys.stderr.write('ERROR (line %s):\t%s\n' % (line_number, error))  # write to stderr
            sys.exit(1)  # and just keep going
    output_file.write(output_line)

input_file.close()
output_file.close()

आप उस स्क्रिप्ट का उपयोग कर सकते हैं

$ ./cp1252_utf8.py file_cp1252.sql file_utf8.sql

-1

विंडोज पर वापस जाएं, एक्लिप्स को यूटीएफ -8 में एन्कोडिंग बदलने के लिए कहें, फिर यूनिक्स में वापस जाएं और d2uफाइलों पर चलाएं ।


हालाँकि यदि बहुत सारी फाइलें हैं, तो यह आपके काम में आने से ज्यादा काम की हो सकती है ...
जोनाथन

D2u क्या है और इसे कहां खोजना है?
जेसपर रोन-जेन्सेन

इसका कभी-कभार नाम बदल दिया जाता है। ऐसा लगता है कि उबंटू इसे fromdos10.04 में कहता है , और यह पैकेज का हिस्सा है tofrodos
जोनाथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.