0

Linuxでファイルを1行ずつ読み取り、各行で部分文字列を見つけて削除し、その行の最後に配置する必要があります。

例:

元のファイルの行:

a,b,c,substring,d,e,f

出力ファイルの行:

a,b,c,d,e,f,substring

Linux コマンドを使用して行うにはどうすればよいですか? ありがとう!

4

2 に答える 2

3
sed '/substring/{ s///; s/$/substring/;} '

固定部分文字列を処理します。部分文字列が で始まる場合,、これは例のケースを適切に処理することに注意してください。部分文字列が固定されていないが、一般的な正規表現である可能性がある場合:

sed 's/\(substring\)\(.*\)/\2\1'

一般的な csv 解析を探している場合は、質問を言い換える必要があります。(入力をカンマ区切りのフィールドと考えている場合、この解決策を適用して行頭の固定文字列を見つけるのは困難です。)

于 2012-09-09T13:44:25.777 に答える
0

私は常に perl のコマンド ラインを使用して、そのような正規表現タスクを実行することを好みます。perl は、私のほとんどの使用法で awk と sed をカバーするのに十分強力であり、Windows と Linux の両方で使用できます。簡単で便利なので、 perl は次のようになります。

perl -ne "s/^(.*?)(?:(?<comma>,)(?<substr>substring)|(?<substr>substring)(?<comma>,))(?<right>.*)$/$1$+{right}$+{comma}$+{substr}/; print" input.txt > output.txt

またはより単純なもの:

perl -lpe "if(s/(,substring|substring,)//){ s/$/,substring/ }" input.txt > output.txt

入力.txt

substring,a,b,c,d,e,f
a,b,c,substring,d,e,f
a,b,c,d,e,f,substring
サブストリング,a
a,substring サブ
ストリング
a

output.txt

a,b,c,d,e,f,部分文字列
a,b,c,d,e,f,部分文字列
a,b,c,d,e,f,部分文字列 a,部分文字

a,部分文字列 部分文字

a

実際の入力に基づいて編集できます。

  • 単語とコンマの間にスペースがある場合
  • タブをセパレータとして使用している場合

コマンドラインの説明:

  • perl の -n -e オプションを使用します。 -n は、ループ内で入力を 1 行ずつ処理することを意味します。-e は、コマンド ラインでの 1 行のプログラムを意味します。
  • perl の -l -p オプションを使用します。 -l はプロセスの複数行を意味します。-p は常に印刷することを意味します
  • 1行のプログラムは、正規表現の置き換えと印刷です
  • (?:pattern) はグループを意味しますが、一致をキャプチャしません
  • (?<comma>) は名前付きグループです。アクセスするには $+{comma} ハッシュを使用する必要があります
于 2012-09-09T14:43:31.117 に答える