恕我直言,你不能只用一個sed
做,但下面可能是一個辦法
$ cat 38680195
qqq abc cdef (1234) [5689a]
qqq abc cdef (134) [4hgh]
line with <angle brackets>
line without brackets
line with {curly braces}
line with [square brackets]
another line without brackets
$ sed -n '/\[[^]]*\]/p' 38680195 && sed -i.backup '/\[[^]]*\]/d' 38680195
qqq abc cdef (1234) [5689a]
qqq abc cdef (134) [4hgh]
line with [square brackets]
$ cat 38680195
line with <angle brackets>
line without brackets
line with {curly braces}
another line without brackets
注意
原始文件的備份被放置在38680195.backup
$ cat 38680195.backup
qqq abc cdef (1234) [5689a]
qqq abc cdef (134) [4hgh]
line with <angle brackets>
line without brackets
line with {curly braces}
line with [square brackets]
another line without brackets
編輯
更智能的方法可能是
grep '\[[^]]*\]' 38680195 && sed -i.backup '/\[[^]]*\]/d' 38680195
在這種情況下,如果沒有一行包含[]
,所述SED部分不會被執行,因爲它在邏輯上是AND
ED(參見&&
)。
如果您可以告訴我們您爲什麼要這樣做,它會幫助我們找到答案,無論您需要以正確的方式做任何事情。具體來說 - 你爲什麼要打印,然後刪除一行,同時打印所有匹配的行,然後一起刪除它們?此外,拿出一個更好地說明你的問題的例子,因爲現在'cat 3.txt; > 3.txt'會產生你想要的輸出。我懷疑這個問題是[XY問題]的一個例子(http://xyproblem.info/)。 –
如果可以的話,可以使用'readarray -t VAR tmp/3.txt'而不是亂搞'IFS'。 – chepner
'readarray -t VAR tmp/3.txt>將顯示如下: 'qqq''abc''cdef''(1234)''[5689a]''abcfde'' [aaaa]''ffff'' [0121]' –