迭代编辑单个文件

迭代编辑单个文件

我有一个文件,其中包含如下声明:

myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(255)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(255)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(255)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(255)
etc

我想将其更改为:

myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)
etc

无论如何,问题的进一步限定是我只想更改属性名称以“in$”结尾的条目,其中 $ 是一个数字(例如 myName_in_3 VARCHAR(255))。

碰巧,“_in”(指示器属性)成对出现,因此执行 n~2(或 FNR%2==0)非常聪明,但我确实想知道识别“_in$ VARCHAR(”是否更好? 255)'作为变革的模式。

我将如何使用易于理解的代码来做到这一点?文件不大,所以性能不是主要问题....只是试图避免大量手动 vi 编辑。

答案1

使用 GNU sed,您可以在格式中指定行地址first~step,以便修改从第二个开始的每隔一行,您可以使用地址2~2,例如

$ sed '2~2 s/(255)/(1)/' file
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)

答案2

awk

$ awk 'FNR%2==0{sub(255,1)}1' file
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)

解释

  • FNR%2==0只匹配偶数行。
  • 如果行是偶数,我们2551,替换sub(255,1)
  • 1是一个真实的条件,进行awkprint $0

相同的逻辑可以用于其他工具,例如perl

perl -pe 's/255/1/ unless $. % 2' file

使用sed,您可以执行以下操作:

sed -e 'n;s/255/1/' file

更新

根据您的更新要求,我们可以稍微更改解决方案。

awk

awk '/_in_[0-9]/{sub(255,1)}1' file

sed

sed -e '/_in_[0-9]/{s/255/1/}' file

perl

perl -pe 's/255/1/ if /_in_[0-9]/' file

答案3

sed '/_in_/ s/255/1/'

这意味着:对于匹配 的行/_in_/,搜索255并替换为1

答案4

cat oldfile.txt |awk '/_in_[0-9]/{sub(255,1)}1' > newfile.txt

相关内容