有沒有辦法替換多個捕獲的組,並用sed
中的鍵值格式(由=
定界)捕獲的組的值替換多個捕獲的組?sed中的多個替換
對不起,這個問題是如此混亂這裏有一個例子
我有什麼:
aaa="src is $src$ user is $user$!" src="over there" user="jason"
我想要的到底是什麼:
aaa="src is over there user is jason!"
我不想硬編碼$var$
的位置,因爲它們可能會改變。
有沒有辦法替換多個捕獲的組,並用sed
中的鍵值格式(由=
定界)捕獲的組的值替換多個捕獲的組?sed中的多個替換
對不起,這個問題是如此混亂這裏有一個例子
我有什麼:
aaa="src is $src$ user is $user$!" src="over there" user="jason"
我想要的到底是什麼:
aaa="src is over there user is jason!"
我不想硬編碼$var$
的位置,因爲它們可能會改變。
sed ':again
s/\$\([[:alnum:]]\{1,\}\)\$\(.*\) \1="\([^"]*\)"/\3\2/g
t again
' YourFile
正如你所看到的,sed是絕對沒有趣的做這種任務......即使有幾行元素,它也可以在很少修改的情況下工作,並且它不需要快速複雜的高級強大語言。
聖多美和普林西比:
爲什麼在't again'處必須有換行符?我試圖在一行中做所有事情,但沒有成功。 – hobbes3
取決於我覺得sed版本,一些工作在GNU sed上。你的理由是由於標籤慣例,必須結束該行;在這種情況下似乎沒有用作行尾。也許可以使用一種格式,比如之前和/或之後的空間。我必須檢查oneliner頁面,看看是否有一些標籤ref也適用於posix sed – NeronLeVelu
這是一個快速的&骯髒的方式來解決它使用perl。它可能在某些方面失敗(空格,轉義雙引號,...),但它會得到這份工作對於大多數簡單的情況下完成的:
perl -ne '
## Get each key and value.
@captures = m/(\S+)=("[^"]+")/g;
## Extract first two elements as in the original string.
$output = join q|=|, splice @captures, 0, 2;
## Use a hash for a better look-up, and remove double quotes
## from values.
%replacements = @captures;
%replacements = map { $_ => substr $replacements{$_}, 1, -1 } keys %replacements;
## Use a regex to look-up into the hash for the replacements strings.
$output =~ s/\$([^\$]+)\$/$replacements{$1}/g;
printf qq|%s\n|, $output;
' infile
它產生:
aaa="src is over there user is jason!"
'Sed'是這個任務的錯誤工具。它缺乏最強大語言的許多數據和控制結構。 – Birei
好吧,所以我想我仍然需要以編程方式完成這項任務。 – hobbes3
sed是爲這樣一種任務而創建的。不是最簡單的,但仍然相對容易 – NeronLeVelu