|パイプ|間の文字を削除してください。

|パイプ|間の文字を削除してください。

変更する必要があるさまざまなテキストファイルがあります。

test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|...

次のように、パイプライン処理を含む「test5232.lop」削除プロセスを自動化しようとしています。

test.xyz|test3.abc|filename.test|file.text|qwerty.bat|...

可能であれば、一時ファイルを生成する必要はありません。

答え1

これは職業のようですcut。区切り文字があり|、保持するフィールド(--complement)ではなく削除するフィールドを指定し、フィールド3(この場合は削除しようとしている)を選択しようとしています。

パスワード:

 cut -d '|' --complement -f 3

テスト:

$ echo 'test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|x' | cut -d '|' --complement -f 3
test.xyz|test3.abc|filename.test|file.text|qwerty.bat|x

答え2

ちょうどSedを使用してください:

sed 's/|test5232\.lop//' file.txt

説明を要求する前に元の答え:

POSIX機能のみを使用してください。:

sed 's/|[^|]*//2' file.txt

すべての行に少なくとも3つの|記号があることがわかっている場合は、より直感的な形式を使用できます。

sed 's/[^|]*|//3' file.txt

答え3

3番目のフィールド(「フィールド」は、「パイプを除くすべて、0回以上、後にパイプが来る」)を別のものに置き換えるには、次のようにします。

awk '{$0=gensub(/[^|]*\|/, "", 3); print $0}' input

明らかに、行のどこからでも「test5232.lop」を削除したいと思います。

sed -i 's/|test5232\.lop//' input

sed -i(一時ファイルの作成を含むすべてのソリューションがありますが)

答え4

また、このawkの簡単な解決策を確認してください。文字列はどこにでも削除され、移植可能でなければなりません。

$ a="test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat"
$ awk -F"test5232.lop." '{printf("%s%s\n",$1,$2)}' <<<"$a"
test.xyz|test3.abc|filename.test|file.text|qwerty.bat

内部編集要求に関しては、GNU AWKバージョン> 4.1も次のように動作できます。友達マニュアル:

awk -i inplace -v INPLACE_SUFFIX=.bak '{...}'

ただし、いかなる場合でも、awk、sed、およびPerlは真の内部編集を達成できません。 GNUsed情報ページでは、この問題を明確に説明しています。

'-i[SUFFIX]'
'--in-place[=SUFFIX]'
     This option specifies that files are to be edited in-place.  GNU
     'sed' does this by creating a temporary file and sending output to
     this file rather than to the standard output.(1).

つまり、最後に次のような内容を追加することで、ここでどんなソリューションでも使用できます。

awk/sed/perl/whatever oldfile >tmpfile && mvtmpfile oldfile && rm -f tmpfile 

関連情報