簡體   English   中英

Linux:如何替換文件中包含引號和逗號的文本字符串

[英]Linux: How to replace a string of text containing quotes and commas in a file

我不是awk,perl或sed的佼佼者,而且我不知道如何替換文件中的文本字符串。

該字符串有點不尋常。 實際上,有2個文件需要我自動替換為1個文件。

該文件包含一行很長的JSON格式的文本。 每行替換將不起作用。

這是我需要替換的文字。 從:

"minimumVersion":2,"librariesLocation":"libraries","objectsLocation":"objects",

"minimumVersion":2,"librariesLocation":"pack/libraries","objectsLocation":"pack/objects",

如您所見,在文本中需要輸入引號和斜杠,以及逗號和庫和對象的多次出現,這使我目前對sed,awk和perl的了解毫無用處。

如何在文本“庫”和“對象”中添加“ pack /”前綴?

請不要嘗試對JSON使用正則表達式。 真討厭 使用JSON解析器:

#!/usr/bin/env perl

use strict;
use warnings;
use JSON; 

my $json_str = '{ "minimumVersion":2,"librariesLocation":"libraries","objectsLocation":"objects" }';

my $json_ob = decode_json($json_str);

print "Before:", $json_ob -> {'librariesLocation'},"\n";

#pattern replace just the values we're interested in.
$json_ob -> {'librariesLocation'} =~ s,^,pack/,;
$json_ob -> {'objectsLocation'} =~ s,^,pack/,;

print "After: ", $json_ob -> {'librariesLocation'},"\n";

#print single line text blob
print encode_json($json_ob);
print "\n\n";

## or perhaps (formatted, multiline, whitespace):

print to_json($json_ob, { canonical => 1, pretty => 1 } );

這適用於粗略示例-如果您想要更好的示例,請給我更多JSON,然后我將重新起草。

輸出:

Before:libraries
After: pack/libraries
{"objectsLocation":"pack/objects","minimumVersion":2,"librariesLocation":"pack/libraries"}

{
   "librariesLocation" : "pack/libraries",
   "minimumVersion" : 2,
   "objectsLocation" : "pack/objects"
}

編輯:要從文件中執行此操作:

local $/; 
open ( my $input, '<', 'source_filename_here' ) or die $!;
open ( my $output, '>', 'output_filename_here' ) or die $!;

my $json_ob = decode_json(<$input>);
#do the transforms

print {$output} encode_json($json_ob); 

或者(從sed / grep等從STDIN打印讀取到STDOUT):

#!/usr/bin/env perl

use strict;
use warnings;
use JSON;

my @stuff_to_change = qw ( librariesLocation objectsLocation );

local $/;

#read from stdin or arg on commmand line. E.g.:
#myscript.pl somefile
#cat json_file | myscript.pl
my $json_ob = decode_json(<>);

#pattern replace just the values we're interested in.
for my $thing (@stuff_to_change) {
    $json_ob->{$thing} =~ s,^,pack/,;
}

#print single line text blob to STDOUT
print encode_json($json_ob);

如何在文本“庫”和“對象”中添加“ pack /”前綴?

一個簡單的sed命令如何:

echo '"minimumVersion":2,"librariesLocation":"libraries","objectsLocation":"objects",' > file

sed 's~"\(libraries\|objects\)"~"pack/\1"~g' file

輸出:

"minimumVersion":2,"librariesLocation":"pack/libraries","objectsLocation":"pack/objects",

要運行ssh:

ssh ip<<'EOF'
sed -i 's~"libraries"~"pack/&"~; s~"objects"~"pack/&"~' file.json 
EOF

sed-就地將完成正確的轉義

$ echo '"minimumVersion":2,"librariesLocation":"libraries","objectsLocation":"objects",' > text.txt      
$ sed --in-place 's/"\(libraries\|objects\)"/"pack\/\1"/g' text.txt
$ cat text.txt 
  "minimumVersion":2,"librariesLocation":"pack/libraries","objectsLocation":"pack/objects",

"pack/libraries"替換模式"libraries" (使用分組和匹配模式的重用)

通過正確的JSON輸入,您可以使用jq

$ jq '.librariesLocation |= "pack/"+., .objectsLocation |= "pack/"+.' <<EOF
{"minimumVersion":2,"librariesLocation":"libraries","objectsLocation":"objects"}
EOF
{
  "minimumVersion": 2,
  "librariesLocation": "pack/libraries",
  "objectsLocation": "objects"
}
{
  "minimumVersion": 2,
  "librariesLocation": "libraries",
  "objectsLocation": "pack/objects"
}

如果輸入僅僅是一個逗號分隔的鍵/值對的列表,你也許可以使用jq濾波前把它變成一個正確的JSON對象,但我不知道jq不夠好,還沒有弄清楚如何。

awk '{gsub(/libraries",|objects",/, "pack/&")}1' file
minimumVersion":2,"librariesLocation":"pack/libraries","objectsLocation":"pack/objects",

暫無
暫無

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

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