我有一个文件,其中包含如下声明:
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
只匹配偶数行。- 如果行是偶数,我们
255
用1
,替换sub(255,1)
。 1
是一个真实的条件,进行awk
print$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