簡體   English   中英

使用正則表達式重命名文本文件的內容

[英]Renaming contents of text file using Regular Expressions

我有一個文本文件,其中的幾行格式如下:

gatename #outputs #inputs list_of_inputs_separated_by_spaces * gate_id

example: 
nand 3 2 10 11 * G0 (The two inputs to the nand gate are 10 and 11)
or 2 1 10 * G1 (The only input to the or gate is gate 10)

我需要做的是重命名內容,以便消除#outputs列,以便最終結果是:

gatename #outputs list_of_inputs_separated_by_spaces * gate_id
nand 2 10 11 * G0
or 1 10 * G1

我嘗試使用Eclipse的查找和替換功能(find參數是一個不起作用的regex語句),但是最終弄亂了gatename。 我正在考慮使用Python腳本並遍歷文本文件的每一行。 我需要幫助的是確定適當的正則表達式語句。

這基本上是cut實用程序的用途:

cut -d " " -f 1,3-

(更新:抱歉,我忘記了-f選項。)

這需要一個文件,考慮用空格分隔的字段,並輸出第一個,第三個和隨后的字段。

(如果您使用的是Windows,則無論如何都應該擁有這些Unix風格的實用程序 ,它們可能非常有用。)

使用正則表達式,您可以將(\\w+) \\d+ (.*)替換$1 $2 就像是:

sed -r -e "s/([^ ]+) [0-9]+ (.*)/\1 \2/" file

要么

perl -p -e "s/(\w+) \d+ (.*)/\1 $2/" file

就像是...:

for theline in fileinput.input(inplace=1):
  print re.sub(r'(\w+\s*+)\d+\s+(.*)', r'\1\2', theline),

...應該滿足您的需求。

就個人而言,如果它是由文檔構成的,則不要理會正則表達式。

只需遍歷文件,對“”字符進行拆分,然后只需省略第二個條目即可。

您確實可以使用以下命令使用Eclipse的查找和替換功能:

Find: ^([a-z]+) \d
Replace with: \1

這實際上是在每行的開頭( ^([az]+) )后面匹配輸出的閘門名稱( \\1 \\d ),並僅用匹配的閘門名稱( \\1 )替換它。

我不知道您在哪個平台上使用Eclipse,但是如果是linux或您擁有cygwin,那么cut很快!

cut -d" " --complement -f2 $FILE

這將使用空格作為定界符,並選擇第二個字段的補碼。

如果您確實想使用正則表達式,則可以執行以下操作:

sed -r 's/^ *([^ ]+) +[^ ]+ +(.+)/\1 \2/' $FILE

您當然可以在python或perl中輕松使用相同的表達式,但是Mitchel的權利-拆分很容易。 (除非文本非常長,否則會浪費時間不必要地拆分其他字段)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM