次のように、すべての偶数行をすべての奇数行の先頭に移動する方法を見つけようとします。
今後:
AAA
BBB
CCC
DDD
後ろに:
BBBAAA
DDDCCC
複数のファイルを同時に実行できればとても良いでしょう。 catを使用してすべてのファイルを結合すると、ファイルが大きすぎて処理できなくなるためです。 bashファイルに追加できるようにテキスト交換を実行する次のコマンドのようになります。
find /directory/. -type f -exec sed -i 's/oldtext/newtext/g' {} \;
検索しましたが、適切なものが見つかりませんでした。
簡単にするには、すべての奇数行の先頭に「string1」を追加し、偶数行の先頭に「string2」を追加します。
before:
string1AAA
string2BBB
string1CCC
string2DDD
after:
string2BBBstring1AAA
string2DDDstring1CCC
とても感謝しています。
答え1
接頭辞の付いたアイデアを忘れてください。あなたが探しているスクリプトは
sed 'N;s/\(.*\)\n\(.*\)/\2\1/'
つまり、 を使用して次の行を読み、順序を変更してN
改行を削除します。
find
作成した内容と組み合わせることができます。まず、オプションなしで試してみて、-i
これが欲しいものをテストしてみてください。
答え2
愚かな解決策:
for f in /directory/*; do gawk -i inplace '{getline nl; print nl$0}' "$f"; done
for f in /directory/*
- 指定されたパスの各ファイルについて
gawk -i inplace
- できるようにする所定の位置にファイルの編集
getline nl
- awkの入力から変数として次のレコードを読み込みますnl
(次の行)。
print nl$0
- 現在および次の交換履歴の印刷
答え3
GNUの使用sed
:
sed '1~2 { h; d; }; G; s/\n//'
そしてawk
:
awk '{ if(NR%2) save = $0; else print $0 save }'
そしてperl
:
perl -pe '$_ = <> . $_; s/\n//'
答え4
eval "`echo 'NL=qsq' | tr 'qs' '\047\012'`"; # newline
set --
while IFS= read -r l; do
case $# in
0 ) set -- "$l" ;;
* ) printf '%s%s\n' "$l" "$1"; set -- ;;
esac
done < input.data
printf '%s' ${1+"$1$NL"} # to take care of dangling line
awk '{ if ( NR % 2 ) ORS = $0 RS; else print }' input.data
perl -lpe '$_ = (<>.$_) =~ s/\n//r' input.data
sed -ne '
${p;d;}
h;n;G;s/\n//p
' input.data
結果
BBBAAA
DDDCCC