2017-12-18 3 views
0

入力テキストファイル:特定の文字列を含まないテキストを同じ行に置き換えるにはどうすればよいですか?

AAA 
BBB_CCC 
BBB 
AAA BBB 

FILE.TXT取得する必要があります:

sed "/_CCC/! s/AAA/AAA_CCC/g;/_CCC/! s/BBB/BBB_CCC/g" file.txt > file_out.txt 

しかし、それは生成します:

AAA_CCC 
BBB_CCC 
BBB_CCC 
AAA_CCC BBB_CCC 

は、私は、次の正規表現でsedを呼び出す

AAA_CCC 
BBB_CCC 
BBB_CCC 
AAA_CCC BBB 

1つの解決策は、同じファイルに対してsedを2回呼び出すことですが、よりエレガントな方法が存在すると思います。それが含まれていないすべてのフィールドに_CCCを追加します

+1

あなたはすべてのフィールドまたはフィールドだけ 'AAA'と' BBB'に '_CCC'を追加しますか?言い換えれば、 'DDD'フィールドがある場合、または' BBB_CCC_BBB'フィールドがあればどうなりますか? – PesaThe

答えて

2

awkソリューション:

EREを使用して
sed 's/\(AAA\|BBB\)\(_CCC\)\?/\1_CCC/g' file 

を::

awk '{ for(i=1; i<=NF; i++) if($i !~ /_CCC$/) $i = $i"_CCC"; }1' file 

#output: 
AAA_CCC 
BBB_CCC 
BBB_CCC 
AAA_CCC BBB_CCC 
4

一つの方法は、それが存在する場合は、体系_CCCを上書きするために構成されてい

sed -E 's/(AAA|BBB)(_CCC)?/\1_CCC/g' file 
2

溶液それは精神であなたに近いです:

$ sed -E '/_CCC/!s/(AAA|BBB)/\1_CCC/g' infile 
AAA_CCC 
BBB_CCC 
BBB_CCC 
AAA_CCC BBB_CCC 

最後の行に_CCCを挿入した後、/_CCC/!チェックに失敗したので、あなたの解決策は失敗します。文字列は、すべての後にそこになりました。私のソリューションでは、1つの置換コマンドを使用するだけでその問題を回避できます。

2

awk

$ awk -v RS=' +|\n' '{sub("(_CCC|)$","_CCC"); ORS=RT}1' file 

AAA_CCC 
BBB_CCC 
BBB_CCC 
AAA_CCC BBB_CCC 
0

さらに別のSEDソリューション:

$ sed 's/\(_CCC\)*\(\|$\)/_CCC\2/g' file 
AAA_CCC 
BBB_CCC 
BBB_CCC 
AAA_CCC BBB_CCC 
関連する問題